我有两种情况可以从IDataReader对象中提取信息
大小写-1-长度,计算序数,然后解析字符串。
public static string GetString(IDataReader rdr, string columnName)
{
int ordinal = rdr.GetOrdinal(columnName);
if (rdr.IsDBNull(ordinal))
{
return string.Empty;
}
return (string)rdr[ordinal];
}例2,短程,不需要计算序数就能得到数据。
public static string GetString(IDataReader rdr, string columnName)
{
return (string)rdr[columnName];
}哪一种技术应该是首选的,以及为什么和如果有任何特定的背景?
发布于 2012-02-16 18:59:57
SqlDataReader's this[string name]看起来像:
public override object this[string name]
{
get
{
return this.GetValue(this.GetOrdinal(name));
}
}因此,它计算序数内部,并且没有什么不同的方式使用。
更新
Yo可以将您的代码重写为:
public static string GetString(IDataReader rdr, string columnName)
{
return (rdr[columnName] as String)??String.Empty;
}发布于 2012-02-16 19:58:34
下面为第一个方法提供了多少东西:
.method public hidebysig static string GetString(class [System.Data]System.Data.IDataReader rdr,
string columnName) cil managed
{
// Code size 49 (0x31)
.maxstack 2
.locals init ([0] int32 ordinal,
[1] string CS$1$0000,
[2] bool CS$4$0001)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: callvirt instance int32 [System.Data]System.Data.IDataRecord::GetOrdinal(string)
IL_0008: stloc.0
IL_0009: ldarg.0
IL_000a: ldloc.0
IL_000b: callvirt instance bool [System.Data]System.Data.IDataRecord::IsDBNull(int32)
IL_0010: ldc.i4.0
IL_0011: ceq
IL_0013: stloc.2
IL_0014: ldloc.2
IL_0015: brtrue.s IL_0020
IL_0017: nop
IL_0018: ldsfld string [mscorlib]System.String::Empty
IL_001d: stloc.1
IL_001e: br.s IL_002f
IL_0020: ldarg.0
IL_0021: ldloc.0
IL_0022: callvirt instance object [System.Data]System.Data.IDataRecord::get_Item(int32)
IL_0027: castclass [mscorlib]System.String
IL_002c: stloc.1
IL_002d: br.s IL_002f
IL_002f: ldloc.1
IL_0030: ret
} // end of method Program::GetString至于你的第二种方法:
.method public hidebysig static string GetStringShort(class [System.Data]System.Data.IDataReader rdr,
string columnName) cil managed
{
// Code size 18 (0x12)
.maxstack 2
.locals init ([0] string CS$1$0000)
IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldarg.1
IL_0003: callvirt instance object [System.Data]System.Data.IDataRecord::get_Item(string)
IL_0008: castclass [mscorlib]System.String
IL_000d: stloc.0
IL_000e: br.s IL_0010
IL_0010: ldloc.0
IL_0011: ret
} // end of method Program::GetStringShort所以方法肯定是不一样的。至于哪个更好,你没有说为什么要计算序数,所以很难说哪个对你的情况更好。
发布于 2012-02-16 18:53:33
我不认为这真的有什么区别(他们做同样的事情),第二个似乎更容易读懂,因为引入“索引”对那些不知道读者是如何工作的人来说是很混乱的。隐藏不必要的复杂性,我说。您应该更进一步,使它成为您可以在任何地方使用的泛型,如下所示:
private static T FromDbValue<T>(IDataReader rdr, string columnName)
{
var value = rdr[columnName];
if (value == DBNull.Value)
{
return default(T);
}
return (T)value;
}调用它很容易:
var someString = FromDbValue<string>(rdr, "CustomerName");编辑:您没有在第二个示例中检查DBNull,因此强制转换将在空值上失败。然而,一般来说,这两种方法是相同的。
https://stackoverflow.com/questions/9317251
复制相似问题