使用SqlParameter和ExecuteScalar获取错误

时间:2013-10-09 19:14:46

标签: c# sql sqlcommand

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 :我已修改此问题。基本上我用另一个问题创建了另一个问题。我也将其标记为已回答。

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

Getting timeout errors with SqlTransaction on same table

3 个答案:

答案 0 :(得分:2)

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

由于int是值类型,因此不能为null;因此,你得到一个错误。

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

答案 1 :(得分:0)

尝试:

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

   //....
}

验证您的查询是否返回了

答案 2 :(得分:0)

@SLaks答案是正确的。

这是避免错误的另一种方法。无需空检查等,Convert.ToInt32可以处理所有事情。

var itExists = Convert.ToInt32(command_serial_new.ExecuteScalar()) > 0;