如何从OdbcDataReader获取行数?

CSh*_*per 4 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;
    }   
}
Run Code Online (Sandbox Code Playgroud)

注意:我只想要行计数OdbcDataReader.

Nic*_*rey 7

好吧,在你全部阅读之前,你不会(也不能)知道结果集中有多少行.

虽然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;
        }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 或者,如果你需要知道总的行数做一些事情的结果之前,你最好的选择是使用像一个DataAdapter和思乐普定了下来,结果集体:

    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
      );
    
    Run Code Online (Sandbox Code Playgroud)

    在我的情况下,产生,

    adapter.Fill() returned 74
    The data table contains 74 rows and 12 columns.
    
    Run Code Online (Sandbox Code Playgroud)

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

select count(*)
from foo
where some-conditions
Run Code Online (Sandbox Code Playgroud)

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

select *
from foo
where some-conditions
Run Code Online (Sandbox Code Playgroud)

ExecuteScalar()使用数据读取器执行第一次使用和第二次使用.

这种方法有两个大问题:

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