1
public TransImport()
{
    ConnString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
    conn_new = new SqlConnection(ConnString);
    command_serial_new = conn_new.CreateCommand();
    command_serial_new.CommandText = "SELECT 1 FROM YSL00 WHERE SERLNMBR = @slnr";
    var p = new SqlParameter("@slnr", SqlDbType.NVarChar, 50);
    command_serial_new.Parameters.Add(p);
    //Here you will start reading flat file to get serialnumber. 
    //Here I have shown a simple call using one value 12345 but it will be 1000's of
    //lines from flatfile.

    if (CheckSerialNumber('12345'))
        DisplayMessage("Good serialnumber"); //this function is not copied here.
}

private Boolean CheckSerialNumber(string SerialNumber)
{
    command_serial_new.Parameters["@slnr"].Value = SerialNumber;
    try
    {
        var itExists = (Int32)command_serial_new.ExecuteScalar() > 0;
        if (itExists)
        {
            return true;
        }
    }
    catch (Exception ex)
    {
        LogException(ex, "Error in CheckSerialNumber =>"+ command_serial_new.CommandText.ToString());
    }
    return false;
}

我在上面的捕获中得到错误。它提到

对象引用未设置为对象实例

ExecuteScalar.

我想我在这里做错了什么,但到目前为止还无法弄清楚。

更新 1:我已经修改了这个问题。基本上我用我面临的问题创建了另一个问题。我也将其标记为已回答。

这是我刚刚发布的新问题。

在同一张表上使用 SqlTransaction 获取超时错误

4

3 回答 3

2

如果ExecuteScalar()退货,就会发生这种情况null。(例如,因为没有匹配的行)

由于int是值类型,所以不能为空;因此,您会收到错误消息。

相反,您可以将其强制转换为int?,这是可以为空的。

于 2013-10-09T19:18:42.893 回答
0

尝试:

int i;
object o = command_serial_new.ExecuteScalar();
if(o != null && Convert.ToInt32(o.ToString()) > 0)
{

   //....
}

验证您的查询是否返回了某些内容

于 2013-10-09T19:20:48.690 回答
0

@SLaks 的答案是正确的。

这是避免错误的另一种方法。不需要空值检查等,Convert.ToInt32照顾一切。

var itExists = Convert.ToInt32(command_serial_new.ExecuteScalar()) > 0;
于 2013-10-09T19:26:04.983 回答