将 SqlDataReader 传递给函数作为转换参数
Posted
技术标签:
【中文标题】将 SqlDataReader 传递给函数作为转换参数【英文标题】:passing SqlDataReader to function as parameter for casting 【发布时间】:2013-10-31 09:17:07 【问题描述】:为了转换 SqlDataReader 的数据,我做了这些(常见数据类型的示例):
string name = reader["name"].ToString(); //for string
int i = 0; i = int.TryParse(reader["i"].ToString(), out i); //for int
int i = reader.GetInt32(reader.GetOrdinal("i")); //or this again for int
bool b = reader.GetBoolean(reader.GetOrdinal("b")); // for boolean
我想创建一个具有这些功能的类:
public static class gd
public static bool Bool(SqlDataReader rd, string name)
return rd.GetBoolean(rd.GetOrdinal(name));
public static int Int(SqlDataReader rd, string name)
int i=0;
i = int.TryParse(reader["i"].ToString(), out i);
return i;
然后只需使用:
int i=c.Int(reader,"i");
bool b=c.Bool(reader,"b");
DateTime dt = c.Date(reader,"dt");
我想知道将 datareader 作为参数传递是个好主意吗?有人有更好的想法来转换数据读取器数据吗?
【问题讨论】:
【参考方案1】:是的,可以将 DataReader 作为参数传递(与任何其他引用类型一样)。当您传递阅读器时,只有对它的引用才会传递给另一个方法。并且可以使用方法让你的代码更具可读性和可维护性。
你可以编写扩展方法来简化你的代码:
public static class Extensions
public static bool GetBoolean(this IDataReader reader, string name)
return reader.GetBoolean(reader.GetOrdinal(name));
public static int GetInt32(this IDataReader reader, string name)
return reader.GetInt32(reader.GetOrdinal(name));
用法如下:
int i = reader.GetInt32("i");
bool b = reader.GetBoolean("b");
【讨论】:
好吧,我曾想过编写一个扩展方法,但不确定这是否是个好主意。非常感谢 @AshkanMobayenKhiabani 扩展方法是一个简单的静态方法。只有编译器才能发挥作用并将扩展方法调用转换为Extensions.GetInt32(reader, "i")
你使用了与sqldatareader完全相同的方法名,不会有问题吗?
@AshkanMobayenKhiabani 不,这不是问题,因为方法签名不同(方法参数也是签名的一部分)
如何在扩展中返回动态结果。喜欢:public static dynamic Get(this IDataReader reader, string name) if (reader.GetFieldType(reader.GetOrdinal(name)) == typeof(string)) return reader.GetString(reader.GetOrdinal(name)); else if (reader.GetFieldType(reader.GetOrdinal(name)) == typeof(int)) return reader.GetInt32(reader.GetOrdinal(name)); return null;
【参考方案2】:
如果您希望在内部处理异常,您的想法似乎很好(传递对 SqlDataReader 的引用不会滞后应用程序)。您可以使用 SqlDataReader 类提供的方法专门用于获取所需格式的数据:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx
检查这些方法是否足以满足您的需求。如果不是,您的静态帮助程序类似乎没问题,但我建议您避免重复已在 SqlDataReader 中实现的功能,因为重新发明***有什么意义?
【讨论】:
以上是关于将 SqlDataReader 传递给函数作为转换参数的主要内容,如果未能解决你的问题,请参考以下文章
在foreach循环中声明时的SQLDataReader对象