Unable to cast object of type 'System.DBNull' to type 'System.String`

前端 未结 11 2008
青春惊慌失措
青春惊慌失措 2020-11-22 06:45

I got the above error in my app. Here is the original code

public string GetCustomerNumber(Guid id)
{
     string accountNumber = 
          (string)DBSqlHel         


        
11条回答
  •  庸人自扰
    2020-11-22 07:27

    ExecuteScalar will return

    • null if there is no result set
    • otherwise the first column of the first row of the resultset, which may be DBNull.

    If you know that the first column of the resultset is a string, then to cover all bases you need to check for both null and DBNull. Something like:

    object accountNumber = ...ExecuteScalar(...);
    return (accountNumber == null) ? String.Empty : accountNumber.ToString();
    

    The above code relies on the fact that DBNull.ToString returns an empty string.

    If accountNumber was another type (say integer), then you'd need to be more explicit:

    object accountNumber = ...ExecuteScalar(...);
    return (accountNumber == null || Convert.IsDBNull(accountNumber) ?     
             (int) accountNumber : 0;
    

    If you know for sure that your resultset will always have at least one row (e.g. SELECT COUNT(*)...), then you can skip the check for null.

    In your case the error message "Unable to cast object of type ‘System.DBNull’ to type ‘System.String`" indicates that the first column of your result set is a DBNUll value. This is from the cast to string on the first line:

    string accountNumber = (string) ... ExecuteScalar(...);
    

    Marc_s's comment that you don't need to check for DBNull.Value is wrong.

提交回复
热议问题