【问题标题】:Why does this code throw "Object reference not set to an instance of an object" exception [closed]为什么此代码会引发“对象引用未设置为对象的实例”异常[关闭]
【发布时间】:2014-01-09 23:58:17
【问题描述】:

我正在尝试使用 datagridview 更新我的数据库,但它抛出“对象引用未设置为对象的实例”异常是我的代码:

foreach (DataGridViewRow dgRow in dataGridView1.Rows)
{
   //string re = dgRow.Cells[0].Value.ToString();
   string re =Convert.ToString(dgRow.Cells[0].Value.ToString());
   string strQuery = "UPDATE unit_master SET unit='"+re.ToString()+"'";
   SqlCommand scmd = new SqlCommand(strQuery,SqlConn);
   scmd.ExecuteNonQuery();
}
SqlConn.Close();

【问题讨论】:

  • 你好。请使用参数化查询并告诉我们错误在哪里。另外,为什么要在字符串上调用Convert.ToString(),而在将字符串转换为字符串时得到的字符串上调用.ToString()
  • 请看this post
  • 实际上上面的代码数据正在更新,但只有异常被抛出。我确实删除了一个 .ToString 转换,但数据没有得到更新。
  • Convert.ToString("Use a Debugger and step through it to find out why".ToString());
  • 改用参数化 SQL。您的代码容易受到 SQL 注入的攻击。 (请参阅 Jeff A.codinghorror.com/blog/2005/04/… 的帖子)

标签: c#


【解决方案1】:

您需要在调试模式下运行您的代码(在 Visual Studio 中按 F5,或单击 Debug->Start Debug)并跟踪它。调试器实际上应该停止并向您显示什么是空的,这样您就可以弄清楚为什么它是空的。您还可以在循环的开头设置断点并单步执行代码的每一行,以便查看发生了什么。您可以对每个变量设置监视,以便查看每一步的值。

很可能 dgRow 为空,或者它没有正确转换为字符串,或者该列的值为空。

作为旁注,您将 dgRow.Cells[0].Value 转换为字符串两次... Value.ToString 已经在进行转换,因此无需再次调用 Convert.ToString()。

【讨论】:

  • 实际上我确实使用调试器运行代码并显示对象引用未设置为对象异常的实例。是的,我正在进行两次转换,因为只有这样我的数据才会更新
  • 所以你在调试中运行了,这很好。当它在异常处停止时,您是否检查了每个变量的值以查看什么是空的?
【解决方案2】:

问题一:请检查您是否正确初始化了SqlConnection实例变量。

问题 2: GridView 单元格可能有 null 。如果你在null 上调用任何函数,它会抛出一个NullReferenceException

建议:使用参数化查询来避免 SQL 注入攻击。

试试这个:

SqlConn = new SqlConnection("/*your connection string*/");
foreach (DataGridViewRow dgRow in dataGridView1.Rows)
{
    if(dgRow.Cells[0].Value!=null)
    {
       string re =dgRow.Cells[0].Value.ToString();
       string strQuery = "UPDATE unit_master SET unit=@unit";
       SqlCommand scmd = new SqlCommand(strQuery,SqlConn);
       scmd.Parameters.AddWithValue("@unit",unit);
       scmd.ExecuteNonQuery();
    }
}
SqlConn.Close();

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-20
  • 1970-01-01
  • 2012-08-04
  • 1970-01-01
  • 2013-12-30
  • 2013-05-17
相关资源
最近更新 更多