我已经成功地将我的项目从 odbc.datareader 切换到 mysql.datareader。问题是使用第一个 /odbc 数据读取器),即使是纯查询,AffectedRows 属性也会正确检索行数。但它不适用于mysql.datareader,然后是-1。所以我看不到如何检索行数,即“结果视图”。编辑:我知道它的前向阅读器,但我不明白的是:如果在 DBreader=command.ExecuteRader() 行放置一个断点,我可以看到 DBreader 在结果视图中具有与行一样多的对象应该。怎么跑了就知道了?谢谢
4 回答
DataReader 不包含行数的原因是计算起来可能非常昂贵。例如,假设您执行一个返回今年输入但未删除的采购订单的查询:
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();
Es muy simple, el reader no tiene la opción de contar cuantas filas existe, el Datatable si tiene esa opció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"];
}
下面是我使用的功能。随意调整它以适应您的需求。
/// <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;
}