如何计算MySqlDataReader中的行?

时间:2009-11-14 09:44:45

标签: c# mysql datareader

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

4 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分: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();

答案 2 :(得分: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; 
    }

答案 3 :(得分:0)

Es muy simple,el reader no tienelaopcióndecontar cuantas filas existe,el Datatable si tieneesaopció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"];
}