得到一个int?来自db使用DbDataReader

Pal*_*tir 2 .net c#

是否有任何聪明的方法来缩短这种淫秽行为?它有效,但它不可读......

int? myVal = r.IsDBNull(r.GetOrdinal("colName")) ? (int?)null : r.GetInt32(r.GetOrdinal("colName"));
Run Code Online (Sandbox Code Playgroud)

谢谢 :)

adr*_*nks 6

您可以将该代码放入扩展方法中DbDataReader(或者在IDataReader它实现的接口上更好).这样,看起来很可怕的代码隐藏在一个看起来更漂亮的GetNullableInt32()调用之后:

public static class IDataReaderExtensions
{
    public static int? GetNullableInt32(this IDataReader r, string columnName)
    {
        int? myVal = r.IsDBNull(r.GetOrdinal(columnName)) 
                        ? (int?) null : 
                        r.GetInt32(r.GetOrdinal(columnName));
        return myVal;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后你可以用它来调用它:

IDataReader reader = ...;
int? value = reader.GetNullableInt32("colName");
Run Code Online (Sandbox Code Playgroud)

正如伊恩指出的那样,最好只召唤r.GetOrdinal()一次:

public static class IDataReaderExtensions
{
    public static int? GetNullableInt32(this IDataReader r, string columnName)
    {
        int ordinal = r.GetOrdinal(columnName);
        int? myVal = r.IsDBNull(ordinal) 
                        ? (int?) null : 
                        r.GetInt32(ordinal);
        return myVal;
    }
}
Run Code Online (Sandbox Code Playgroud)