NullReferenceException 未处理 (对象引用未设置为对象的实例。[复制]

NullReferenceException was unhandled (Object reference not set to an instance of an object.) [duplicate]

提问人:Bakhtiyar_Dler 提问时间:3/18/2023 最后编辑:marc_sBakhtiyar_Dler 更新时间:3/19/2023 访问量:73

问:

我想使用 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);

我该如何解决这个问题?

C# DataGridView SQL-Insert NullReferenceException

评论

0赞 marc_s 3/18/2023
SQL 注入警报 - 你不应该将你的 SQL 语句连接在一起 - 改用参数化查询来避免 SQL 注入 - 查看 Little Bobby Tables
0赞 Bakhtiyar_Dler 3/19/2023
但是我该怎么做呢?能给我更多细节吗?
0赞 marc_s 3/19/2023
搜索 SQL Server 参数化查询 - 必须有数以千计的教程,了解如何以正确的方式执行此操作!
0赞 marc_s 3/19/2023
从这里开始:learn.microsoft.com/en-us/aspnet/web-forms/overview/data-access/...

答:

-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 的原因。