【问题标题】:MYSQL null value interfereing with C# applicationMYSQL 空值干扰 C# 应用程序
【发布时间】:2013-12-22 06:50:44
【问题描述】:

好的,我正在编写一个 WPF 程序,该程序将文本框绑定到 MySQL 表。

[图片已删除 - 显示个人详细信息]

现在,如果我运行,输入详细信息,如上保留一些空白,然后单击保存,然后信息将按预期保存到 mysql 中。如何删除默认的 NULL 值并将单元格留空,这基本上是我想要的。

现在,如果我直接在 MYSQL 中打开数据库并在那里输入另一条记录,则会留下空白字段,并带有 NULL 值。如果您键入内容然后在我注意到的数据库中删除它们,*NULL 值就会消失。

[图片已删除 - 显示个人详细信息]

现在通常这不会是一个问题,但我每次点击 NEXT 时都会收到此错误,这应该会显示下一条记录 错误消息:数据为空。不能对 Null 值调用此方法或属性。 有趣的是,当直接在 MySQL 中运行时,查询似乎可以正常工作。

这是下一个按钮的代码:

//next button command
private void next_Click(object sender, RoutedEventArgs e)
{
    //MySQL connection credentials
    string sqlcon = "datasource = localhost; port = 3306; username = root; password = Avalisque";
    //Query
    string query = "select * from clients.parent where tag = (select min(tag) from users.login where tag > '" + this.tag.Text + "' );";

    MySqlConnection con = new MySqlConnection(sqlcon);
    MySqlCommand cmd = new MySqlCommand(query, con);
    MySqlDataReader rdr;

    //Excecution
    try
    {
        con.Open();
        rdr = cmd.ExecuteReader();

        while (rdr.Read())
        {
            //String declarations
            string stag = rdr.GetInt32("tag").ToString();
            string snumber = rdr.GetInt32("tag").ToString();
            string smember = rdr.GetInt32("member").ToString();
            string sstatus = rdr.GetString("status");

            string sfirst = rdr.GetString("first_name");
            string ssecond = rdr.GetString("second_name");
            string sthird = rdr.GetString("third_name");
            string sfourth = rdr.GetString("surname");

            string sdob = rdr.GetString("dob");
            string sgender = rdr.GetString("gender");

            string scell = rdr.GetString("cell");
            string shome = rdr.GetString("home");
            string swork = rdr.GetString("work");
            string semail = rdr.GetString("email");

            string sdoc = rdr.GetString("doc");
            string seligible = rdr.GetString("eligible");
            string sreason = rdr.GetString("denial_reason");
            string sother = rdr.GetString("other");

            string sclaim = rdr.GetString("claims");
            string srisk = rdr.GetString("risk");
            string sowing = rdr.GetString("owing");
            string spaid = rdr.GetString("paid");

            // Binding strings to textboxes
            tag.Text = stag;
            number.Text = stag;
            member.Text = smember;
            status.Text = sstatus;

            first_name.Text = sfirst;
            second_name.Text = ssecond;
            third_name.Text = sthird;
            surname.Text = sfourth;

            dob.Text = sdob;
            gender.Text = sgender;

            cell.Text = scell;
            home.Text = shome;
            work.Text = swork;
            email.Text = semail;

            doc.Text = sdoc;
            eligible.Text = seligible;
            reason.Text = sreason;
            other.Text = sother;
       }

       con.Close();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
}

如果我在 C# 应用程序中使用数据网格保存记录,则 NULL 值保持不变。 有没有办法确保默认情况下不将 NULL 值赋予空白单元格?无论如何,文本框是如何做到的?我试过右键单击表格 -> 更改表格 -> 从默认列中删除 null 但它什么也没做。

我将大量使用数据网格来插入记录,但如果文本框不能用于浏览它们,那么......我想你现在已经明白了。有什么办法可以解决这个问题?如果没有,有什么替代方案吗?

【问题讨论】:

  • 您可以在这里使用多种解决方案:更改您的数据库结构以不允许您的 char 列为空。您可以将它们的默认值设置为 ''(空字符串)。另一种解决方案是直接在您的代码中管理它,例如:email.Text = semail ?? String.Empty;.
  • 最简单的方法是将列默认更改为 '' 而不是 null,这样您就不必更改代码。 ALTER TABLE tablename CHANGE columnname columnname VARCHAR(10) DEFAULT '' NOT NULL
  • 顺便说一句,您不应该像 cell.Text = scell; 那样直接设置输入值。你应该使用 WPF 绑定:看看this documentation
  • 已删除图像并显示个人数据。也标记为 mod 注意。
  • 异常信息还是一样:Data is Null。不能对 Null 值调用此方法或属性。

标签: c# mysql wpf


【解决方案1】:

在获取string 值之前检查每一列的值,或者可以将函数设计为,

public static string GetString(SqlDataReader reader, string colName)
{
    if (reader[colName] == DBNull.Value)
        return string.Empty;
    else
        return (string)reader[colName];            
}

并将其用作,

string sclaim = GetString(rdr,"claims");

编辑在某些地方,您还将int 转换为string,以便您可以使用单个函数,

public static string GetColumnValueAsString(SqlDataReader reader, string colName)
{
    if (reader[colName] == DBNull.Value)
        return string.Empty;
    else
        return reader[colName].ToString();        
}

然后您就可以通过一个函数访问所有列,而无需担心null

    string stag = GetColumnValueAsString(rdr, "tag");
    string snumber = GetColumnValueAsString(rdr, "tag");
    string smember = GetColumnValueAsString(rdr, member);
    string sstatus = GetColumnValueAsString(rdr,"status");

【讨论】:

  • 谢谢一群朋友。真的。在大多数情况下,它实际上是有效的。当我问到这基本上是我要求的解决方案时,它会移动到下一条记录。问题是每次单击下一步时都会弹出该死的错误消息。任何线索为什么?
  • 每次点击下一步时,当我通过数据网格或 MySQL 表编辑器输入记录时,我的意思是说...
  • @Offer 你能粘贴你在异常中得到的堆栈跟踪或异常详细信息吗
【解决方案2】:

问题是您的字符串没有初始化,它们实际上是 NULL 值,我的建议是:

if(string.IsNullOrEmpty(stringValue)) stringValue ="";

将其应用于您的字符串,它应该可以解决问题。

【讨论】:

  • 非常感谢艾登。尽管按顺序应用了这些解决方案,但 dbw 在这方面做得很好。给了他他的信任,但还是要感谢他。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-23
  • 2022-09-28
  • 1970-01-01
  • 2017-10-15
  • 1970-01-01
相关资源
最近更新 更多