1

以下帖子与 phxsoftware ( http://sqlite.phxsoftware.com )的 System.Data.SQLite 数据提供程序有关

我对 DbDataReader 的 Read 方法和/或 Visual Studio 2008 有疑问(也可能是问题)。在许多示例中,我看到如下内容(我知道这段代码没有多大意义……但它提供了一个目的):

DbDataReader reader = null;
Long ltemp = 0;
lock (m_ClassLock)
{
   DbCommand cmd = dbCnn.CreateCommand();
   cmd.CommandText = “SELECT col1 FROM table1”;
   reader = cmd.ExecuteReader();

   if (null != reader)
   {
      while (reader.Read())
      {
         ltemp += (long)reader[0];
      }
   }
reader.Close();

第一个问题 - 我从这个例子中不明白的是我第一次通过调用 reader.Read() 在 while 循环中丢失数据吗?例如,如果读取器具有值 (3,5,7,9),则从 cmd.ExecuteReader() 返回的读取器最初应该指向 3,对吗?reader.Read() 然后在 while 循环内的后续调用中移动到 5、7 和 9。但是,因为 reader.Read() 在第一个“ltemp += ...”行之前被调用,我是否跳过了第一个结果 (3)?

第二个问题-(我开始认为这可能是VS中的一个错误)如果我在“if(null!= ...”行的断点处停止时在调试器中单步执行这组代码,我可以清楚地看到 mu 将鼠标悬停在弹出窗口中并向下钻取,即阅读器分配了多个行数据值。但是,如果我关闭该弹出信息,然后尝试将其恢复,当我向下钻取时,我现在看到了该行“枚举没有结果”之前有明确的数据。

谁能解释这种行为?

4

1 回答 1

1
  1. 运行 ExecuteReader 后,请像这样考虑它,该集合位于第 -1 行。您需要执行 Read 才能到达第 0 行。

  2. IDataReader 是一个仅向前的结构,您只能迭代一次,调试器正在迭代它。

一般的问题:

  • 为什么要锁?
  • 为什么对阅读器进行 null 检查 - 我不知道 ExecuteReader 在选择后返回 null 的任何问题。
  • 为什么不“从 table1 中选择 SUM(col1)
  • 你为什么不遵循处置模式?
于 2009-06-17T01:15:09.757 回答