提问人:Bakhtiyar_Dler 提问时间:3/18/2023 最后编辑:marc_sBakhtiyar_Dler 更新时间:3/19/2023 访问量:73
NullReferenceException 未处理 (对象引用未设置为对象的实例。[复制]
NullReferenceException was unhandled (Object reference not set to an instance of an object.) [duplicate]
问:
我想使用 textBox 将数据插入到我的数据库中。
但是我不想将重复的 ID 添加到我的数据库,我想显示一个消息框。
实际上我做到了,但是当我想添加与所有ID不同的新数据时,我收到错误
NullReferenceException 未处理 (对象引用未设置为对象的实例)
这是我的代码
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (textBox1.Text == dataGridView1.Rows[i].Cells[0].Value.ToString())
{
MessageBox.Show("This ID is already exist", "Something went wrong", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox1.Focus();
return;
}
}
DataTable dt = new DataTable();
string query = "insert into InOrder(InodID, OrderNum, SuppID, CarID, Price, Amount, OrderDate) values ('" + textBox1.Text + "','" + textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" + textBox5.Text + "','" + textBox6.Text + "','" + dateTimePicker1.Text + "')";
SqlDataAdapter sda = new SqlDataAdapter(query, connect);
sda.Fill(dt);
dataGridView1.DataSource = dt;
MessageBox.Show("Your data successfully saved", "Congratulation", MessageBoxButtons.OK, MessageBoxIcon.None);
我该如何解决这个问题?
答:
-1赞
Samuel Bouchard
3/18/2023
#1
您面临的问题很可能是由于您正在使用 DataAdapter 将数据插入数据库,但您实际上并没有执行查询。相反,您正在尝试使用查询结果填充 DataTable,这在此上下文中没有意义。
若要解决此问题,应将代码更改为使用 SqlCommand 对象直接执行插入查询。下面是应该可以工作的代码的更新版本:
// Check for duplicate ID
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
if (textBox1.Text == dataGridView1.Rows[i].Cells[0].Value.ToString())
{
MessageBox.Show("This ID is already exist", "Something went
wrong", MessageBoxButtons.OK, MessageBoxIcon.Warning);
textBox1.Focus();
return;
}
}
// Insert data into database
string query = "insert into InOrder(InodID, OrderNum, SuppID, CarID,
Price, Amount, OrderDate)values('" + textBox1.Text + "','" +
textBox2.Text + "','" + textBox3.Text + "','" + textBox4.Text + "','" +
textBox5.Text + "','" + textBox6.Text + "','" + dateTimePicker1.Text +
"')";
using (SqlCommand cmd = new SqlCommand(query, connect))
{
cmd.ExecuteNonQuery();
}
// Refresh the DataGridView with the updated data
DataTable dt = new DataTable();
string selectQuery = "select * from InOrder";
SqlDataAdapter sda = new SqlDataAdapter(selectQuery, connect);
sda.Fill(dt);
dataGridView1.DataSource = dt;
MessageBox.Show("Your data successfully saved", "Congratulation",
MessageBoxButtons.OK, MessageBoxIcon.None);
请注意,我还添加了代码,以便在插入操作完成后使用更新的数据刷新 DataGridView。这可确保用户立即看到更新的数据。
评论
1赞
Jon Skeet
3/18/2023
复制 SQL-Injection-Vulnerable 代码,甚至没有评论它是一个巨大的安全漏洞,这并不是很好的 IMO。(老实说,我怀疑这是否真的是 NRE 的原因。
评论