如何在MySqlDataReader中计算行数?

4
我已经成功地将我的项目从odbc.datareader切换到mysql.datareader。问题是,使用第一个(odbc datareader)时,即使它是纯查询,AffectedRows属性也可以正确检索行数。但是在mysql.datareader中不起作用,它返回-1。 因此,我无法找到检索行数的方法,即“结果视图”。 编辑:我知道它是单向读取器,但我不理解的是:如果我在DBreader = command.ExecuteRader()的行上设置断点,我可以看到DBreader在结果视图中具有与应该有的行数相同的对象。为什么只有运行后才知道呢? 谢谢
4个回答

3
DataReader没有包含行数是因为它的计算成本非常昂贵。例如,假设你执行了一个查询,返回今年录入并且未删除的采购订单:
SELECT * FROM PurchaseOrders 
WHERE PurchaseDt > '2009-01-01'
AND IsDeleted = 0

您可以使用DataReader查询并读取前10行。SQL Server会在客户端请求时将"流式传输"行。每当您要求另一行时,SQL Server都会执行查询的下一步。因此,在您实际读出所有行之前,甚至SQL Server也不知道总行数。


我该如何仅请求10行数据?如果我执行SELECT * ....,我假设C#数据读取器会一次性完成所有操作,这意味着应用程序将在查询完成之前冻结吗? - Petr
请求查询10行的一种方法是仅调用10次Read()。另一种方法是在MySQL查询末尾附加“LIMIT 10”。 - Andomar
是的,但我不想这样做 :) 我在问,如果我发送简单的SELECT all查询,那么数据库连接将与每个读取一起工作,然后它会关闭? - Petr
不确定这是否是您要问的,但您可以使用相同的连接运行多个查询。在使用ExecuteReader打开新的DataReader之前,必须关闭旧的DataReader。 - Andomar

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();

1
很简单,Reader没有计算行数的选项,Datatable有该选项。因此,我们将Reader中的所有数据传递到Datatable中,并使用它(展示如何获取总行数和特定记录的方法)。
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。请在您的代码中包含一些解释(您修复了什么?原始问题出了什么问题?)仅包含未注释代码的答案可能会被标记为低质量并删除。 - Graham

0
以下是我使用的函数。请随意根据您的需求进行调整。
    /// <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; 
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接