如何计算MySqlDataReader中的行?

问题描述 投票:4回答:4

我已成功将项目从odbc.datareader切换到mysql.datareader。问题是,使用第一个/ odbc datareader),AffectedRows属性即使在纯查询时也能正确检索行数。但它不能与mysql.datareader一起使用,那么它就是-1。所以我看不出如何检索行数的方式,即“结果视图”。编辑:我知道它只是前向阅读器,但我不明白的是:如果一个断点到DBreader = command.ExecuteRader()行,我可以看到DBreader在结果视图中有多少个对象作为行应该。它是如何在跑步后才知道的?谢谢

c# mysql datareader
4个回答
3
投票

DataReader不包含rowcount的原因是计算起来非常昂贵。例如,假设您执行的查询返回今年输入但未删除的采购订单:

SELECT * FROM PurchaseOrders 
WHERE PurchaseDt > '2009-01-01'
AND IsDeleted = 0

并且您将此查询与DataReader一起使用并读出前10行。 SQL Server在请求它们时将“流”行“流”到客户端。每当您要求另一行时,SQL Server将执行查询的下一步。因此,在您实际读出所有行之前,SQL Server甚至都不知道总行数。


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

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; 
    }

0
投票

这很简单,读者无法计算有多少行,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"];
}
© www.soinside.com 2019 - 2024. All rights reserved.