2

我需要检查记录是否保存到数据库中。如果它保存在数据库中,请打开另一个表单,否则显示一条消息,表明它不在数据库中。
如果记录不在数据库中,我会收到此错误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");
}
4

2 回答 2

7

ExecuteScalarnull没有找到记录时返回。

所以当你尝试施放时,null -> int你会得到一个NullReferenceException

试试这个。

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

Convert.ToInt320当参数为 时将返回null

于 2013-11-15T09:05:15.730 回答
2

SqlCommand.ExecuteScalar

返回值

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

这就是为什么当结果没有行时,您实际上尝试转换nullInt32.

看起来你需要改变你的线路;

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

因为当参数是时Convert.ToInt32返回。0null

返回值

一个 32 位有符号整数,等于 value 中的数字,如果 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);
...
于 2013-11-15T09:04:58.337 回答