如果用户在SQL中未提供任何值,如何设置null值

本文关键字:何设置 设置 null 任何值 SQL 用户 如果 | 更新日期: 2023-09-27 18:06:35

大家好,我有下面的代码,用于使用C#Sql和ADO.NET将数据输入数据库。我有两列,如果用户不想在ITEM_MODELQUANTITY中输入值,我希望它在数据库中保存为null。我允许IS NULL用于该列。当我为这些列提供空值时,它说MUST DECLARE VALUES @ITEM_MODEL。如果用户不提供任何值,我希望这些列自动取空值:

try
                {
                    using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["CS"].ConnectionString))
                    {
                        string query = "INSERT INTO CUSTOMER_CREDIT_RECORDS VALUES(@CUSTOMER_NAME,@TODAYS_TOTAL,@AMOUNT_RECIEVED,0,@DATE_SALE,@ITEM_MODEL,@QUANTITY,@CUSTOMER_CODE)";
                        da.InsertCommand = new SqlCommand(query, con);
                        da.InsertCommand.Parameters.Add("@CUSTOMER_NAME", SqlDbType.VarChar).Value = txtCustomerName.Text;
                        da.InsertCommand.Parameters.Add("@TODAYS_TOTAL", SqlDbType.Money).Value = txtTodaystotal.Text;
                        da.InsertCommand.Parameters.Add("@AMOUNT_RECIEVED", SqlDbType.Money).Value = txtAmountRecieved.Text;
                        da.InsertCommand.Parameters.Add("@DATE_SALE", SqlDbType.Date).Value = dateTimePicker1.Value;
                        if (!String.Equals(txtTodaystotal.Text, "0"))
                        { 
                            da.InsertCommand.Parameters.Add("@ITEM_MODEL", SqlDbType.VarChar).Value = txtItemModelCredir.Text;
                            da.InsertCommand.Parameters.Add("@QUANTITY", SqlDbType.Int).Value = txtQuantityCredit.Text;
                        }
                        else
                        {
                            da.InsertCommand.Parameters.Add("@ITEM_MODEL", SqlDbType.VarChar).Value = "";
                            da.InsertCommand.Parameters.Add("@QUANTITY", SqlDbType.Int).Value = "";
                        }
                        da.InsertCommand.Parameters.Add("@CUSTOMER_CODE", SqlDbType.VarChar).Value = txtCustomerCode.Text;
                        con.Open();
                        da.InsertCommand.ExecuteNonQuery();
                    }
                }
                catch
                {
                    MessageBox.Show("Customer does not exist", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                }

如果用户在SQL中未提供任何值,如何设置null值

您可以使用DBNull.Value。当您没有要插入的值时,可以使用此值,然后相应记录的列值将为null。

例如,使用您的代码:

if (!String.Equals(txtTodaystotal.Text, "0"))
{ 
    da.InsertCommand.Parameters.Add("@ITEM_MODEL", SqlDbType.VarChar).Value = txtItemModelCredir.Text;
    da.InsertCommand.Parameters.Add("@QUANTITY", SqlDbType.Int).Value = txtQuantityCredit.Text;
}
else
{
    da.InsertCommand.Parameters.Add("@ITEM_MODEL", SqlDbType.VarChar).Value = DBNull.Value;
    da.InsertCommand.Parameters.Add("@QUANTITY", SqlDbType.Int).Value = DBNull.Value;
}

我建议在INSERT时使用字段名。这用于:

  1. 确保对表的任何更改都将对代码产生最小的影响。如果DBA用不同顺序的列重新创建表,或者添加列(可能使用列默认值(,那么代码就不会中断或做一些可怕的事情,比如将数据插入错误的列中
  2. 您可以从字段列表中完全排除任何没有数据的列。这允许数据库选择默认值(如果在列级别设置的话(。如果您决定在没有值的情况下为某个度量插入默认的0值,则可以在数据库级别设置该值

示例:

INSERT TABLE ( FIELD1, FIELD2, FIELD3 ) VALUES ( @FIELD1, @FIELD2, @FIELD3 );

如果你没有@FIELD2的值,你可以生成:

INSERT TABLE ( FIELD1, FIELD3 ) VALUES ( @FIELD1, @FIELD3 );

即使您不打算使用此方法来修复丢失的数据问题,列出字段仍然是个好主意。

因为您没有使用存储过程-顺便说一句,这会更舒适。在存储过程中,您可以为参数-->定义默认值,然后只需将它们设置为NULL或任何您想要的值。在您的情况下,验证输入完全是您的责任。因此,您可以只检查输入是否为null或空,并根据该决定在传递输入或DbNull值之间进行选择。你的代码看起来像这样:

da.InsertCommand.Parameters.Add("@ITEM_MODEL", SqlDbType.VarChar).Value = string.IsNullOrEmpty(txtItemModelCredir.Text) ? DBNull.Value : txtItemModelCredir.Text;
da.InsertCommand.Parameters.Add("@QUANTITY", SqlDbType.Int).Value = string.IsNullOrEmpty(txtQuantityCredit.Text) ? DBNull.Value : txtQuantityCredit.Text;