对象引用未设置为对象c#错误的实例

时间:2013-11-15 09:03:08

标签: c# sql

我需要检查记录是否保存到数据库中。如果它保存在数据库中打开另一个表单,则显示一条消息,表明它不在数据库中 如果记录不在数据库中,我会收到此错误Object reference not set to an instance of an object.
这是我的代码,请帮我在这里找到错误:

string cmdStr = "Select NO from COM_LIST_EXPORT where NO = '" + txtNO.Text + "'";
SqlCommand cmd = new SqlCommand(cmdStr, CN);
int count = (int)cmd.ExecuteScalar();
if (count == Convert.ToInt32(txtNO.Text))
{
    Archive_Sader dd = new Archive_Sader();
    dd.Show();
}

else
{
    MessageBox.Show("please save first");
}

2 个答案:

答案 0 :(得分:4)

找不到记录时,

ExecuteScalar返回null

因此,在尝试投射null -> int时,您会获得NullReferenceException

试试这个。

int count = Convert.ToInt32(cmd.ExecuteScalar());
当参数为Convert.ToInt32时,

0将返回null

答案 1 :(得分:1)

来自SqlCommand.ExecuteScalar

  

返回值

     

结果集中第一行的第一列,或null   如果结果集为空,则引用。

这就是为什么当结果没有行时,您实际上会尝试将null转换为Int32

看起来你需要更改你的行;

int count = Convert.ToInt32(cmd.ExecuteScalar());

当参数为0时,Convert.ToInt32会返回null

  

返回值

     

32位有符号整数,等于值或   如果value为null,则为0(零)。

你应该总是使用parameterized queries。这种字符串连接对SQL Injection攻击开放。

例如;

string cmdStr = "Select NO from COM_LIST_EXPORT where NO = @NO";
SqlCommand cmd = new SqlCommand(cmdStr, CN);
cmd.Parameters.AddWithValue("@NO", txtNO.Text);
...