将datareader值转换为a到Nullable变量

Ela*_*nda 9 c# sql

我正在尝试运行以下代码,但得到一个转换错误.如何重写我的代码以实现相同的目标?

boolResult= (bool?)dataReader["BOOL_FLAG"] ?? true;
intResult= (int?)dataReader["INT_VALUE"] ?? 0;
Run Code Online (Sandbox Code Playgroud)

谢谢

tay*_*onr 14

在数据读取器上使用"IsDbNull"方法...例如:

bool? result = dataReader.IsDbNull(dataReader["Bool_Flag"]) ? null : (bool)dataReader["Bool_Flag"]
Run Code Online (Sandbox Code Playgroud)

编辑

你需要做类似的事情:布尔?nullBoolean = null;

你有

bool? result = dataReader.IsDbNull(dataReader["Bool_Flag"]) ? nullBoolean : (bool)dataReader["Bool_Flag"]
Run Code Online (Sandbox Code Playgroud)

  • 你可以干脆做吗?(bool?)null:(bool)dataReader ["Bool_Flag"]` (2认同)

Gio*_*lbo 10

考虑在一个函数中执行它.

这是我过去使用过的东西(你可以在.net 4中将其作为扩展方法):

public static T GetValueOrDefault<T>(SqlDataReader dataReader, System.Enum columnIndex)
{
    int index = Convert.ToInt32(columnIndex);

    return !dataReader.IsDBNull(index) ? (T)dataReader.GetValue(index) : default(T);
}
Run Code Online (Sandbox Code Playgroud)

编辑

作为扩展(未经测试,但您明白了),并使用列名而不是索引:

public static T GetValueOrDefault<T>(this SqlDataReader dataReader, string columnName)
{

    return !dataReader.IsDBNull(dataReader[columnName]) ? (T)dataReader.GetValue(dataReader[columnName]) : default(T);
}
Run Code Online (Sandbox Code Playgroud)

用法:

bool? flag = dataReader.GetValueOrDefault("BOOL_COLUMN");
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢第二种扩展方法.但是,由于`IsDBNull()`只接受`int`,你必须调用类似:`dataReader.IsDBNull(dataReader.GetOrdinal(columnName))` (5认同)

Jos*_*osh 6

这里有一个可能有用的答案:https : //stackoverflow.com/a/3308515/1255900

您可以使用“as”关键字。请注意评论中提到的注意事项。

nullableBoolResult = dataReader["BOOL_FLAG"] as bool?;
Run Code Online (Sandbox Code Playgroud)

或者,如果您没有使用可空值,如您原来的帖子所示:

boolResult = (dataReader["BOOL_FLAG"] as bool?) ?? 0;
Run Code Online (Sandbox Code Playgroud)