如何计算 MySqlDataReader 中的行数?
Posted
技术标签:
【中文标题】如何计算 MySqlDataReader 中的行数?【英文标题】:How to count rows in MySqlDataReader? 【发布时间】:2009-11-14 09:44:45 【问题描述】:我已成功地将我的项目从 odbc.datareader 切换到 mysql.datareader。问题是使用第一个 /odbc 数据读取器),即使是纯查询,AffectedRows 属性也会正确检索行数。但它不适用于mysql.datareader,然后是-1。 所以我看不到如何检索行数,即“结果视图”。 编辑:我知道它的前向阅读器,但我不明白的是:如果在 DBreader=command.ExecuteRader() 行放置一个断点,我可以看到 DBreader 在结果视图中具有与行一样多的对象应该。怎么跑了就知道了? 谢谢
【问题讨论】:
【参考方案1】:DataReader 不包含行数的原因是计算起来可能非常昂贵。例如,假设您执行一个查询,该查询返回今年输入但未删除的采购订单:
SELECT * FROM PurchaseOrders
WHERE PurchaseDt > '2009-01-01'
AND IsDeleted = 0
然后您将此查询与 DataReader 一起使用并读出前 10 行。 SQL Server 在请求时将行“流式传输”到客户端。每当您请求另一行时,SQL Server 将执行查询的下一步。因此,在您实际读出所有行之前,甚至 SQL Server 都不知道总行数。
【讨论】:
我如何只要求 10 行?如果我执行 SELECT * ...。我假设 C# 数据阅读器一步完成,我的意思是应用程序将冻结直到查询未完成? 请求 10 行的一种方法是仅调用 Read() 10 次。另一种方法是在 MySQL 查询的末尾附加LIMIT 10
是的,但我不想这样做 :) 我在问如果我发送简单的 SELECT all 查询会怎样,所以数据库连接适用于每个读取然后关闭?
不确定这是否是您所要求的,但您可以使用同一连接运行多个查询。您必须先关闭旧的 DataReader,然后才能使用 ExecuteReader 打开一个新的。【参考方案2】:
要计算一个表中有多少行(例如名称是 studentTable),首先我使用以下 SQL 语句:
SELECT COUNT(*) FROM studentTable
我将该语句用作 MySqlCommand 对象的命令文本。
然后要知道使用 MySqlDataReader 的对象(例如它的名称是 reader)的值(多少行),我使用以下代码:
reader.GetString(0);
下面是我使用的代码:
...
MySqlConnection conn = new MySqlConnection(connString);
MySqlCommand command = conn.CreateCommand();
command.CommandText = "SELECT COUNT(*) FROM studentTable";
try
conn.Open();
catch (Exception ex)
label1.Content = ex.Message;
reader = command.ExecuteReader();
while (reader.Read())
label1.Content = "";
label1.Content = reader.GetString(0);
reader.Close();
conn.Close();
【讨论】:
【参考方案3】:Es muy simple, el reader no tiene la opción de contar cuantas filas existe, el Datatable si tiene esa opción。 Entonces lo que hacemos es pasar todos los datos del Reader al Datatable y trabajamos con este (se muestra como recuperar el total de filas, y como recuperar un registro especifico)。
String consulta = "SELECT * FROM xxx";
conexion.Open();
comando.CommandText = consulta;
reader = command.ExecuteReader();
DataTable dt = new DataTable();
dt.Load(reader);
int nrofilas = dt.Rows.Count;
foreach (DataRow dr in dt.Rows)
var value = dr["nameField"];
【讨论】:
欢迎来到 Stack Overflow。请在您的代码中包含一些解释(您修复了什么?原始问题哪里出错了?)只有未注释代码的答案可以被标记为低质量并被删除。【参考方案4】:以下是我使用的功能。随意调整它以适应您的需求。
/// <summary>
/// Counts the number of rows in a given table.
/// </summary>
/// <param name="tableName">The name of the table to query.</param>
/// <param name="closeConnectionWhenDone">A flag indicating whether the connection should be closed once the query is executed.</param>
/// <returns>The number of rows in the table.</returns>
private static int GetNumRowsInTable(string tableName, bool closeConnectionWhenDone = false)
string selectQueryString = String.Format("select 1 from 0;", tableName);
int numRows = 0;
CommandBehavior behavior = closeConnectionWhenDone ? CommandBehavior.CloseConnection : CommandBehavior.Default;
using (var command = new OdbcCommand(selectQueryString, ODBCHelper.Connection))
using (var reader = command.ExecuteReader(behavior))
while (reader.Read())
numRows++;
return numRows;
【讨论】:
以上是关于如何计算 MySqlDataReader 中的行数?的主要内容,如果未能解决你的问题,请参考以下文章