C# 将SqlDataReader传递给函数作为强制转换的参数

C# 将SqlDataReader传递给函数作为强制转换的参数,c#,type-conversion,sqldatareader,sqldatatypes,C#,Type Conversion,Sqldatareader,Sqldatatypes,对于SqlDataReader的强制转换数据,我执行以下操作(常见数据类型的示例): 我想用以下函数创建一个类: public static class gd{ public static bool Bool(SqlDataReader rd, string name) { return rd.GetBoolean(rd.GetOrdinal(name)); } public static int Int(SqlDataReader rd, stri

对于SqlDataReader的强制转换数据,我执行以下操作(常见数据类型的示例):

我想用以下函数创建一个类:

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作为参数传递是一个好主意吗?是否有人对转换datareader数据有更好的想法?

是的,可以将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");
如果希望在内部处理异常,您的想法似乎很好(将引用传递给SqlDataReader不会延迟应用程序)。您可以使用SqlDataReader类提供的方法专门获取所需格式的数据:


检查这些方法是否适合您。如果不是,您的静态助手类似乎还可以,但我建议您避免重复已经在SqlDataReader中实现的功能,因为重新发明轮子有什么意义?

我曾想过编写一个扩展方法,但不确定这是否是一个好主意。谢谢lot@AshkanMobayenKhiabani扩展方法是一种简单的静态方法。它是唯一一个执行此魔法并将扩展方法调用转换为
Extensions.GetInt32(reader,“i”)
的编译器。您使用了sqldatareader已经拥有的完全相同的方法名称,这不是问题吗?@AshkanMobayenKhiabani不,这不是问题,因为方法签名不同(方法参数也是签名的一部分)在扩展中返回动态结果怎么样。比如:
public静态动态Get(这个IDataReader读取器,字符串名){if(reader.GetFieldType(reader.GetOrdinal(name))==typeof(string))返回reader.GetString(reader.GetOrdinal(name));else if(reader.GetFieldType(reader.GetOrdinal(name))==typeof(int))返回reader.GetInt32(reader.GetOrdinal(name));返回null;}
int i = reader.GetInt32("i");
bool b = reader.GetBoolean("b");