进入数据库时出现空值异常
本文关键字:空值 异常 数据库 | 更新日期: 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.text
和time.text
标签分别显示日期和时间。它们在表单加载事件中被赋值。txtName.text
和txtCost.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();
}
}