进入数据库时出现空值异常

本文关键字:空值 异常 数据库 | 更新日期: 2023-09-27 18:10:59

我已经在一个基于服务的数据库中创建了一个表来存储销售信息。该表包括日期、时间、名称、采购、数量、成本(以这种特定的方式)列。插入表的代码是

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)'v11.0;AttachDbFilename=C:'Users'rnawa_000'Documents'Visual Studio 2013'Projects'Random'Random'sales.mdf;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
conn.Open();
cmd.CommandText = "insert into salesTB (Date,Time,Name,Quantity,Cost) values ('"+date.Text+"','"+time.Text+"','"+txtName.Text+"','"+listBox1.Items.Count+"','"+ txtCost.Text+")";
foreach (string item in listBox1.Items)
{
    cmd.CommandText = "insert into salesTB (Purchase) values ('" +item.Substring(0,10)  + "')";
}
cmd.ExecuteNonQuery();
cmd.Clone();
conn.Close();

date.texttime.text标签分别显示日期和时间。它们在表单加载事件中被赋值。txtName.texttxtCost.text标签使用构造函数

从先前的形式获得它们的值
public Form2(ListBox.ObjectCollection objectCollection, string name,string total)
{
    InitializeComponent();
    this.listBox1.Items.AddRange(objectCollection);
    txtName.Text = name;
    txtCost.Text = total;   
}

当我执行这个,它给我一个错误说"不能插入值NULL到列'成本'"。如果我在数据库的成本列中设置allow null它会在异常错误中显示任何其他列名

进入数据库时出现空值异常

您需要使用参数化查询来避免错误,因为您正在连接显式字符串值。此外,你的逻辑是错误的,这样做会导致非规范化的数据,这将是可怕的任何数据库管理员排序。我会考虑使用下面的代码:

SqlConnection conn = new SqlConnection(@"Data Source=(LocalDB)'v11.0;AttachDbFilename=C:'Users'rnawa_000'Documents'Visual Studio 2013'Projects'Random'Random'sales.mdf;Integrated Security=True");
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
conn.Open();
foreach (string item in listBox1.Items)
{
    cmd.CommandText = "insert into salesTB (Date,Time,Name,Quantity,Cost,Purchase) values (@date, @time, @name, @quantity, @cost, @purchase)";
    cmd.Parameters.Add(new SqlParameter("date", date.Text));
    cmd.Parameters.Add(new SqlParameter("time", time.Text));
    cmd.Parameters.Add(new SqlParameter("name", txtName.Text));
    cmd.Parameters.Add(new SqlParameter("quantity", listBox1.Items.Count));
    cmd.Parameters.Add(new SqlParameter("cost", txtCost.Text));
    cmd.Parameters.Add(new SqlParameter("purchase", item.Substring(0,10)));
    cmd.ExecuteNonQuery();
    cmd.Clone();
}
conn.Close();

没有经过测试,但是你明白了。

这是一个更好和更安全的方法来做你想做的事情:

      string SQLQuery = "INSERT INTO salesTB (Date,Time,Name,Quantity,Cost)" +
                            "VALUES (@date, @time, @name, @quantity, @cost)";
        using (SqlConnection DBConn = new SqlConnection(cs.ToString()))
        {
            using (SqlCommand sqlCmd = new SqlCommand(SQLQuery, DBConn))
            {
                sqlCmd.Parameters.Add("@date", SqlDbType.Text);
                sqlCmd.Parameters["@date"].Value = date.Text;
                sqlCmd.Parameters.Add("@time", SqlDbType.Text);
                sqlCmd.Parameters["@time"].Value = time.Text;
                sqlCmd.Parameters.Add("@name", SqlDbType.Text);
                sqlCmd.Parameters["@name"].Value = txtName.Text;
                sqlCmd.Parameters.Add("@quantity", SqlDbType.Int);
                sqlCmd.Parameters["@quantity"].Value = listBox1.Items.Count;
                sqlCmd.Parameters.Add("@cost", SqlDbType.Text);
                sqlCmd.Parameters["@cost"].Value = txtCost.Text
                DBConn.Open();
                sqlCmd.ExecuteNonQuery();
                DBConn.Close();
            }
        }