本文的发布号曾为 CHS308352
有关本文的 Microsoft Visual Basic .NET 版本,请参见
308050。
本文引用下面的 Microsoft .NET 框架类库名称空间:
本文引用下面的 Microsoft .NET 框架类库名称空间:
- System.Data
- System.Data.SqlClient
症状
在使用 OleDbDataReader 或 SqlDataReader 类时,没有任何 RecordCount 属性可指示正被获取的记录的数量。原因
DataReader 对象或后端数据源通常不知道正获取的记录的数量,直到最后一条记录发送到客户端。在 ActiveX 数据对象 (ADO) 记录集使用只向前游标检索数据时,它甚至会针对 RecordCount 属性返回 -1。 DataReader 表现类似的行为,因为它使用只向前游标检索行和列。
解决方案
若要解决此问题,请使用下列方法之一:- 在通过该阅读器时对记录进行计数。
- 先运行 SELECT COUNT(*) 查询。请注意,此查询到您阅读完数据时可能会过时。
状态
这种现象是设计使然。更多信息
再现现象的步骤
- 启动 Microsoft Visual Studio .NET。
- 在 Visual C# .NET 中新建一个 Windows 应用程序。默认情况下将创建 Form1。
- 确保您的项目包含一个对 System.Data 名称空间的引用,如果未包含,请添加一个对此名称空间的引用。
- 将一个命令按钮放在 Form1 上,将其 Name 属性更改为 btnTest。
- 对 System 和 System.Data 名称空间使用 Imports 语句,这样,在后面的代码中就不需要在这些名称空间中限定声明了。
using System; using System.Data; using System.Data.SqlClient;
- 返回到"窗体"视图,然后双击 btnTest 以添加单击事件处理程序。将下面的代码添加到处理程序:
String myConnString = "User ID=sa;password=sa;Initial Catalog=pubs;Data Source=mySQLServer"; String mySelectQuery = "SELECT * FROM Authors"; SqlConnection myConnection = new SqlConnection(myConnString); SqlCommand myCommand = new SqlCommand(mySelectQuery, myConnection); myConnection.Open(); SqlDataReader myReader ; myReader = myCommand.ExecuteReader(); int RecordCount = 0; try { while (myReader.Read()) { RecordCount++; } if (RecordCount == 0) MessageBox.Show("No data returned"); else MessageBox.Show("Number of Records returned:" + RecordCount); } catch (Exception ex) { MessageBox.Show(ex.ToString()); } finally { myReader.Close(); myConnection.Close(); }
- 根据您的环境相应地修改连接字符串 (myConnString)。
- 保存项目。
- 在调试菜单上,单击启动,运行您的项目。
- 单击该按钮。请注意,您可以看到记录的计数。
参考
有关其他信息,请单击下列文章编号,查看相应的 Microsoft 知识库文章:194973 PRB:ADO:Recordcount May Return -1(PRB:ADO:Recordcount 可能会返回 -1)
这篇文章中的信息适用于:
- Microsoft ADO.NET(随 .NET 框架一起提供)
- Microsoft Visual C# .NET (2002)
最近更新: | 2002-6-17 (1.0) |
关键字 | kbDSupport kbGrpDSMDAC kbprb kbSqlClient kbSystemData KB308352 |