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