2

为了转换 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 作为参数传递是个好主意吗?有人有更好的想法来投射数据读取器数据吗?

4

2 回答 2

5

是的,可以将 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");
于 2013-10-22T13:20:23.790 回答
1

如果您希望在内部处理异常,您的想法似乎很好(传递对 SqlDataReader 的引用不会滞后应用程序)。您可以使用 SqlDataReader 类提供的方法专门用于获取所需格式的数据:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.aspx

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

于 2013-10-22T13:22:11.083 回答