标签: dbdatareader

在迭代DbDataReader之前是否可以使用DbCommand

我有一个简单的应用程序,需要执行某些查询来获取数据库架构信息.我写了一个简单的方法来执行查询并返回一个读者,像这样 -

public static DbDataReader ExecuteQuery(DbConnection connection,string sql)
{
   DbCommand command = connection.CreateCommand();
   command.CommandText = sql;

   using(command)
   {
      return command.ExecuteReader();    
   }
}
Run Code Online (Sandbox Code Playgroud)

调用代码确实关闭连接并适当地处理读取器和连接.

我的问题 - 在迭代读取器之前,是否可以将命令实例(通过使用块完成)放弃?关闭阅读器后,我不希望填充任何OUT参数.ADO.NET API是否有任何严格的准则?

c# ado.net dispose dbdatareader

6
推荐指数
1
解决办法
657
查看次数

通用 DbDataReader 到 List<T> 映射

我的属性绑定数据访问类有一个小问题(更像是一个烦恼)。问题是当读取器中不存在类中相应属性的列时,映射会失败。

代码

这是映射器类:

// Map our datareader object to a strongly typed list
private static IList<T> Map<T>(DbDataReader dr) where T : new()
{
    try
    {
        // initialize our returnable list
        List<T> list = new List<T>();
        // fire up the lamda mapping
        var converter = new Converter<T>();
        while (dr.Read())
        {
            // read in each row, and properly map it to our T object
            var obj = converter.CreateItemFromRow(dr);
            // add it to our list
            list.Add(obj);
        }
        // reutrn it
        return list;
    } …
Run Code Online (Sandbox Code Playgroud)

c# reflection expression-trees dbdatareader linq-expressions

5
推荐指数
1
解决办法
4155
查看次数

SqlDataReader/DbDataReader实现问题

有谁知道DbDataReaders如何实际工作.我们可以使用SqlDataReader作为示例.

当您执行以下操作时

cmd.CommandText = "SELECT * FROM Customers";

var rdr = cmd.ExecuteReader();

while(rdr.Read())
{
  //Do something
}
Run Code Online (Sandbox Code Playgroud)

数据读取器是否具有内存中的所有行,或者它只是抓取一个,然后当调用Read时,它是否会转到db并抓住下一个?似乎只是将一个内存带入内存将是糟糕的性能,但带来所有这些将使得它需要一段时间调用ExecuteReader.

我知道我是这个对象的消费者,并且实现它并不重要,但我只是好奇,我想我可能会花几个小时在Reflector中来了解它在做什么,所以我想问一个可能知道的人.

如果有人有想法,我只是好奇.

sql sqldatareader dbdatareader

3
推荐指数
1
解决办法
1244
查看次数

DbDataReader错误:读取器关闭时无效尝试调用Read

您好我试图从方法返回DataReader但它返回一个关闭的DbDataReader对象.任何想法来解决这个问题.我愿意接受任何使代码更好的建议.

谢谢

更新 我不想让数据库连接保持打开状态.是否有任何方法可以在关闭连接后返回打开的DataReader.

internal DbDataReader ExecuteReader(SqlCommand command, CommandBehavior behavior, string connectionString)
  {
    DbDataReader dataReader = null;
    try
    {
      SqlConnection connection = GetConnection(connectionString);
      Open(connection);
      command.Connection = connection;
      command.CommandTimeout = 60;
      dataReader = command.ExecuteReader(behavior);
      Close(connection);
    }
    catch
    {
    }
    return dataReader;
}
Run Code Online (Sandbox Code Playgroud)

c# sqldatareader dbdatareader c#-4.0

3
推荐指数
1
解决办法
628
查看次数

如何最好地使用C#DbDataReader循环一批结果

我正在批量执行一些SQL查询,然后批量获取所有结果集.我的代码当前放在一起的方式,第一个结果集被跳过.现在我知道了这一点,我可以简单地在我的循环之外引用另一个声明来获取第一个结果,但是我想知道是否有更优雅的解决方案来解决这个问题.

这里有一些sudo代码:

DbDataReader reader= /*some stuff that returns a batch of results...*/;

while (reader.NextResult())
{
   while (reader.Read())
   {
       if (!reader.IsDBNull(0))
       {
           //do things with the data....
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

现在我原本期望NextResult()在你第一次调用它时将你带到第一个结果,这就是Read()似乎做的事情.然而它实际上似乎是在第一次通话时带你到第二个结果.我是否误解了您希望如何使用此方法,或者您是否真的希望执行以下操作:

DbDataReader reader= /*some stuff that returns a batch of results...*/;

//this deals with the row in the the very first result
while (reader.Read())
{
    if (!reader.IsDBNull(0))
    {
        //do things with the data....
    }
}

//this deals with the rest of the rows...
while (reader.NextResult())
{
   while (reader.Read())
   {
       if (!reader.IsDBNull(0)) …
Run Code Online (Sandbox Code Playgroud)

c# dbdatareader

0
推荐指数
1
解决办法
2320
查看次数