【问题标题】:How to insert int NULL into numeric database field?如何将 int NULL 插入数字数据库字段?
【发布时间】:2016-02-25 06:28:33
【问题描述】:

我正在尝试使用 C# 从 winform 文本框将 NULL 值插入数字数据库字段。我正在创建一个应用程序来将生产数据输入数据库。数量变量设置为 int?接受 null ,因为如果一件设备坐下,就没有值可以输入。数据库字段的默认值也设置为 Null。我如何能够将文本框留空并在数据库字段中输入 Null?我已缩减代码以包含受影响的内容。

private void btnInsert_Click(object sender, EventArgs e)
    {
        int? runQty = 0;
        int? scrapQty = 0;

        try
        {
            dbConn = new OleDbConnection();
            dbConn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + ch + strDataFilePath + ch;
            dbConn.Open();

            sql = "INSERT INTO DailyProduction (runQty, scrapQty)" +
            "Values (@runQty, @scrapQty)";

            dbCmd = new OleDbCommand(sql, dbConn);

            if (runQty.HasValue)
            {
                runQty = Convert.ToInt16(this.runQuatity.Text);
                dbCmd.Parameters.Add("@runQty", OleDbType.Numeric).Value = runQty;
            }
            else
            {
                runQty = null;
                dbCmd.Parameters.Add("@runQty", OleDbType.Numeric).Value = runQty;
            }

            if (scrapQty.HasValue)
            {
                scrapQty = Convert.ToInt16(this.scrapQuantity.Text);
                dbCmd.Parameters.Add("@scrapQty", OleDbType.Numeric).Value = scrapQty;
            }
            else
            {
                scrapQty = null;
                dbCmd.Parameters.Add("@scrapQty", OleDbType.Numeric).Value = scrapQty;
            }

            dbCmd.Connection.Close();
            dbConn.Close();

            MessageBox.Show("Record Entered!");
        }
        catch (Exception err)
        {
            MessageBox.Show("Error: " + err.Message.ToString());
        }
    }

【问题讨论】:

  • runQty.HasValue 没有意义,因为您还没有给 runQty 一个值。此时它将始终为 0。应该是!String.IsNullOrEmpty(this.runQuatity.Text)。其他 IF 也是如此
  • social.msdn.microsoft.com/Forums/en-US/… 表示将值设置为DBNull.Value
  • Convert.ToInt16() 是您的问题所在。按照设计,它将 null 转换为 0。您需要检查runQuantity.Text是否为空,然后将DBNull设置为参数值。
  • 不添加参数默认为null。

标签: c# database winforms nullable


【解决方案1】:

你可以这样做:

var runQty = string.IsNullOrEmpty(this.runQuatity.Text)
    ? DBNull.Value
    : Convert.ToInt16(this.runQuatity.Text);
dbCmd.Parameters.Add("@runQty", OleDbType.Numeric).Value = runQty;

var scrapQty = string.IsNullOrEmpty(this.scrapQuantity.Text)
    ? DBNull.Value
    : Convert.ToInt16(this.scrapQuantity.Text);
dbCmd.Parameters.Add("@scrapQty", OleDbType.Numeric).Value = scrapQty;

【讨论】:

    【解决方案2】:

    您可以使用string.IsNullOrEmpty()string.IsNullOrWhiteSpace() 方法检查字符串是否为空:

    if (string.IsNullOrEmpty(textBox1.Text))
    {
        ...
    }
    

    另外,对于null 值,您应该使用DbNull.Value

    dbCmd.Parameters.Add("@runQty", OleDbType.Numeric).Value = DbNull.Value;
    dbCmd.Parameters.Add("@scrapQty", OleDbType.Numeric).Value = DbNull.Value;
    

    【讨论】:

    • 谢谢,我在另一篇文章中看到了这种类型的解决方案,但我认为字符串不会起作用,因为我使用的是 int。无论如何,我应该尝试过。这完全符合我的想法。
    猜你喜欢
    • 2018-10-14
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多