SQL Data Reader - handling Null column values

前端 未结 27 2196
甜味超标
甜味超标 2020-11-22 08:53

I\'m using a SQLdatareader to build POCOs from a database. The code works except when it encounters a null value in the database. For example, if the FirstName column in the

相关标签:
27条回答
  • 2020-11-22 09:23

    Here is helper class which others can use if they need based on @marc_s answer:

    public static class SQLDataReaderExtensions
        {
            public static int SafeGetInt(this SqlDataReader dataReader, string fieldName)
            {
                int fieldIndex = dataReader.GetOrdinal(fieldName);
                return dataReader.IsDBNull(fieldIndex) ? 0 : dataReader.GetInt32(fieldIndex);
            }
    
            public static int? SafeGetNullableInt(this SqlDataReader dataReader, string fieldName)
            {
                int fieldIndex = dataReader.GetOrdinal(fieldName);
                return dataReader.GetValue(fieldIndex) as int?;
            }
    
            public static string SafeGetString(this SqlDataReader dataReader, string fieldName)
            {
                int fieldIndex = dataReader.GetOrdinal(fieldName);
                return dataReader.IsDBNull(fieldIndex) ? string.Empty : dataReader.GetString(fieldIndex);
            }
    
            public static DateTime? SafeGetNullableDateTime(this SqlDataReader dataReader, string fieldName)
            {
                int fieldIndex = dataReader.GetOrdinal(fieldName);
                return dataReader.GetValue(fieldIndex) as DateTime?;
            }
    
            public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName)
            {
                return SafeGetBoolean(dataReader, fieldName, false);
            }
    
            public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName, bool defaultValue)
            {
                int fieldIndex = dataReader.GetOrdinal(fieldName);
                return dataReader.IsDBNull(fieldIndex) ? defaultValue : dataReader.GetBoolean(fieldIndex);
            }
        }
    
    0 讨论(0)
  • 2020-11-22 09:25

    For a string you can simply cast the object version (accessed using the array operator) and wind up with a null string for nulls:

    employee.FirstName = (string)sqlreader[indexFirstName];
    

    or

    employee.FirstName = sqlreader[indexFirstName] as string;
    

    For integers, if you cast to a nullable int, you can use GetValueOrDefault()

    employee.Age = (sqlreader[indexAge] as int?).GetValueOrDefault();
    

    or the null-coalescing operator (??).

    employee.Age = (sqlreader[indexAge] as int?) ?? 0;
    
    0 讨论(0)
  • 2020-11-22 09:25

    Old question but maybe someone still need an answer

    in real i worked around this issue like that

    For int :

    public static object GatDataInt(string Query, string Column)
        {
            SqlConnection DBConn = new SqlConnection(ConnectionString);
            if (DBConn.State == ConnectionState.Closed)
                DBConn.Open();
            SqlCommand CMD = new SqlCommand(Query, DBConn);
            SqlDataReader RDR = CMD.ExecuteReader();
            if (RDR.Read())
            {
                var Result = RDR[Column];
                RDR.Close();
                DBConn.Close();
                return Result;
            }
            return 0;
        }
    

    the same for string just return "" instead of 0 as "" is empty string

    so you can use it like

    int TotalPoints = GatDataInt(QueryToGetTotalPoints, TotalPointColumn) as int?;
    

    and

    string Email = GatDatastring(QueryToGetEmail, EmailColumn) as string;
    

    very flexible so you can insert any query to read any column and it'll never return with error

    0 讨论(0)
提交回复
热议问题