如果用户在SQL中未提供任何值,如何设置null值
本文关键字:何设置 设置 null 任何值 SQL 用户 如果 | 更新日期: 2023-09-27 18:06:35
大家好,我有下面的代码,用于使用C#Sql和ADO.NET将数据输入数据库。我有两列,如果用户不想在ITEM_MODEL
和QUANTITY
中输入值,我希望它在数据库中保存为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);
}
您可以使用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
时使用字段名。这用于:
- 确保对表的任何更改都将对代码产生最小的影响。如果DBA用不同顺序的列重新创建表,或者添加列(可能使用列默认值(,那么代码就不会中断或做一些可怕的事情,比如将数据插入错误的列中
- 您可以从字段列表中完全排除任何没有数据的列。这允许数据库选择默认值(如果在列级别设置的话(。如果您决定在没有值的情况下为某个度量插入默认的
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;