读者可以为Nulllable的整数值

nee*_*eel 9 c# sql

我们如何从Sql Data Reader读取整数空值

SqlDataReader reader = cmd.ExecuteReader();
if (reader.Read() == true)
{
    mb.Id = (int)reader["Id"];
    mb.Mem_NA = (string)reader["Mem_NA"];
    mb.Mem_ResAdd4 = reader["Mem_ResAdd4"] == System.DBNull.Value ? null : (string)reader["Mem_ResAdd4"];
    //
   mb.Mem_ResPin = reader["Mem_ResPin"] as  int? ?? default(int);
  // shows the error "Object cannot be cast from DBNull to other types."
 }
Run Code Online (Sandbox Code Playgroud)

mb.Mem_ResPin无法从读者那里读到

 CREATE TABLE [dbo].[Mem_Basic] (
[Id]          INT           IDENTITY (1, 1) NOT NULL,
[Mem_NA]      VARCHAR (100) NOT NULL,
[Mem_ResAdd4] VARCHAR (100) NULL,
[Mem_ResPin]  INT           NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
Run Code Online (Sandbox Code Playgroud)

Mik*_*Rin 9

只需转换它,就像你在前一行中那样

mb.Mem_ResAdd4 = reader["Mem_ResAdd4"] == System.DBNull.Value ? null : (string)reader["Mem_ResAdd4"];
//
    mb.Mem_ResPin = reader["Mem_ResPin"]== System.DBNull.Value ? default(int):(int)reader["Mem_ResPin"]
Run Code Online (Sandbox Code Playgroud)


Adr*_*scu 7

我对所有数据库强制转换使用通用扩展方法:

public static T? DbCast<T>(this object dbValue)
        where T : struct
    {
        if (dbValue == null)
        {
            return null;
        }
        if (dbValue is System.DBNull)
        {
            return null;
        }
        T? value = dbValue as T?;
        if (value != null)
        {
            return value;
        }
        var conv = dbValue as IConvertible;
        if (conv != null)
        {
            value = (T)conv.ToType(typeof(T), CultureInfo.InvariantCulture);
        }
        return value;
    }
Run Code Online (Sandbox Code Playgroud)

它试图处理到目前为止我们遇到的每一种情况。根据需要调整条件。

用法:

int? value = reader["Mem_ResAdd4"].DbCast<int>()
Run Code Online (Sandbox Code Playgroud)


jwa*_*zko 5

写一个简单的包装,例如作为扩展方法,并检查IsDBNull内部:

public static int SafeGetInt(this SqlDataReader reader, string colName)
{
    var colIndex = reader.GetOrdinal(colName);
    return !reader.IsDBNull(colIndex) ? reader.GetInt32(colIndex) : default(int);
}
Run Code Online (Sandbox Code Playgroud)

用法:

var result = reader.SafeGetInt(colName);
Run Code Online (Sandbox Code Playgroud)