String.IsNullOrEmpty和DBNull.Value之间的意外行为

时间:2013-04-30 17:58:29

标签: c#

我有以下查询:

public static string GetCustomerName(string customerNo)
{
   string query = "query to get customer";
   var myConn= new MYConnection();
   using (SqlConnection con = new SqlConnection(myConn.MYConnectionString))
   {
       con.Open();
       SqlCommand cmd = new SqlCommand(query, con);
       cmd.Parameters.Add("@customerNo", SqlDbType.NVarChar).Value = customerNo;
       object result = cmd.ExecuteScalar();
       return result == DBNull.Value ? String.Empty : (string)result;
   }

}

我正在调用上面的方法:

string customerName = GetCustomerName(CustomerID);

if (customerName.Contains(Constants.Company.CompanyName))
{

    Additional Logic...
}

但是,如果我的方法没有返回客户名称,我将收到Object Reference Null错误。我认为GetCustomer方法将返回一个空字符串。

如果我更改了将CustomerName设置为下面的调用,那么它可以正常工作。

string customerName = GetCustomerName(emailAndSTCodeInfo.CustomerID);
if (String.IsNullOrEmpty(customerName))
{
    customerName = "";
}
if (customerName.Contains(Constants.Chase.ACCOUNT_NAME))
{
    Additional Logic
}

所以,我的问题是,如果我的GetCustomer方法找不到记录并返回null,那么处理这个问题的正确方法是什么。我目前正在使用上面的工作代码,但它似乎是一个黑客或其他东西。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

如果查询未返回任何行,则使用ExecuteScalar执行该操作将返回null,而不是DBNull.Value

因此,您的GetCustomerName方法需要检查null返回值以及DBNull.Value

答案 1 :(得分:2)

如果没有返回记录,

ExecuteScalar将返回null。

为了保证GetCustomerName永远不会返回null,您可以将最后一行更改为

return Convert.ToString(result);
如果参数为null或Convert.ToString(object)

DBNull.Value将返回空字符串。