我已成功将项目从odbc.datareader切换到mysql.datareader。问题是,使用第一个/ odbc datareader),AffectedRows属性即使在纯查询时也能正确检索行数。但它不能与mysql.datareader一起使用,那么它就是-1。所以我看不出如何检索行数的方式,即“结果视图”。编辑:我知道它只是前向阅读器,但我不明白的是:如果一个断点到DBreader = command.ExecuteRader()行,我可以看到DBreader在结果视图中有多少个对象作为行应该。它是如何在跑步后才知道的?谢谢
DataReader不包含rowcount的原因是计算起来非常昂贵。例如,假设您执行的查询返回今年输入但未删除的采购订单:
SELECT * FROM PurchaseOrders
WHERE PurchaseDt > '2009-01-01'
AND IsDeleted = 0
并且您将此查询与DataReader一起使用并读出前10行。 SQL Server在请求它们时将“流”行“流”到客户端。每当您要求另一行时,SQL Server将执行查询的下一步。因此,在您实际读出所有行之前,SQL Server甚至都不知道总行数。
要计算表中的行数(例如名称为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();
以下是我使用的功能。您可以根据自己的需要进行调整。
/// <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;
}
这很简单,读者无法计算有多少行,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"];
}