如何从OdbcDataReader获取行数?

时间:2015-01-15 18:53:02

标签: c#

我使用OdbcDataReader从我的数据库中获取结果,我想知道结果的行数。实现这一目标的最佳方法是什么?

public string[] GetHeaderAndColumnValues(string[] arrAllColumns, string[] arrExtColumns, string sRowDelimiterDisplayText, OdbcDataReader readerOdbc)
{
    //Approach-1: Code to get row count but this is expensive approach.
    using (DataTable dt = new DataTable())
    {
        dt.Load(readerOdbc);
        int i = dt.Rows.Count;
    }   
}

注意:我只想要OdbcDataReader的行数。

1 个答案:

答案 0 :(得分:6)

嗯,在你全部阅读之前,你不会知道结果集中有多少行。

虽然OdbcDataReader确实有RecordsAffectedProperty:它的

  • 在您阅读所有行之前有效,
  • 仅适用于受插入,删除或更新语句影响的行。

这对读取没有多大用处。所以,你可以

  • 在阅读时计算每一行:

    using ( OdbcConnection connection = new OdbcConnection(connectionString) )
    using ( OdbcCommand command = connection.CreateCommand() )
    {
      connection.Open();
      command.CommandText = "select * from sys.objects";
      using ( OdbcDataReader reader = command.ExecuteReader() )
      {
        int rowcount = 0 ;
        while ( reader.Read() )
        {
          ++rowcount;
        }
      }
    }
    
  • 或者,如果您在对结果执行某些操作之前需要知道总行数,那么最好的选择是使用类似dataAdapter的内容并将结果设置为 en masse

    DataTable dt = new DataTable() ;
    int rows ;
    
    using ( OdbcConnection connection = new OdbcConnection(connectionString) )
    using ( OdbcCommand command = connection.CreateCommand() )
    using ( OdbcDataAdapter adapter = new OdbcDataAdapter(command) )
    {
      connection.Open();
      command.CommandText = "select * from sys.objects";
      rows = adapter.Fill(dt);
    }
    
    Console.WriteLine( "adapter.Fill() returned {0}",rows);
    Console.WriteLine( "The data table contains {0} rows and {1} columns.",
      dt.Rows.Count ,
      dt.Columns.Count
      );
    

    在我的情况下产生

    adapter.Fill() returned 74
    The data table contains 74 rows and 12 columns.
    

第三个不是非常有用的选项是运行两个查询:一个获取rowcount:

select count(*)
from foo
where some-conditions

第二个,与第一个相同,返回行:

select *
from foo
where some-conditions

使用ExecuteScalar()执行第一次,使用数据阅读器执行第二次。

这种方法有两大问题:

  1. 你做了两倍的工作量。
  2. 它引入了并发问题:第一次和第二次查询的执行之间的行数可能会发生很大变化。