如何在阅读器关闭之前返回 MySqlDataReader [重复]
-
11-12-2019 - |
题
好的,我的代码目前是:
public MySqlDataReader CreateQuery(string queryString, string connectionString )
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
using (MySqlCommand command = new MySqlCommand(queryString, connection))
{
command.Connection.Open();
command.ExecuteNonQuery();
MySqlDataReader reader = command.ExecuteReader();
return reader;
}
}
}
在另一个函数中,我有:
using(MySqlDataReader readers = _connection.CreateQuery(query, connectString))
目前,在这种形式下,当我将 reader 返回到 reader 时,没有任何价值。我已经完成了检查,并验证了在返回时,读者中包含正确的信息。然而读者没有价值观。我可能错过了一些完全愚蠢的东西。但我们将不胜感激。谢谢!
解决方案
使用 using 命令,您的代码实际上将在控制权返回给调用者之前处理连接和命令。本质上,在 using 语句中创建的连接对象和命令对象在调用代码能够使用它之前就被释放,因此它不再可用。
您可能想对查询结果而不是读取器本身执行某些操作。也许将其加载到表中?就像是:
public DataTable CreateQuery(string queryString, string connectionString )
{
DataTable results = new DataTable("Results");
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
using (MySqlCommand command = new MySqlCommand(queryString, connection))
{
command.Connection.Open();
command.ExecuteNonQuery();
using (MySqlDataReader reader = command.ExecuteReader())
results.Load(reader);
}
}
return results;
}
其他提示
而不是返回 Datareader
或将所有记录复制到内存中 DataTable
如果你作为一个整体返回,你可以返回一个 IEnumerable<IDataRecord>
这是基本界面 DataReader
记录工具。
所以这应该有效,因为 yield
导致 Connection
保持活力:
public IEnumerable<IDataRecord> CreateQuery(string queryString, string connectionString)
{
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
using (MySqlCommand command = new MySqlCommand(queryString, connection))
{
command.Connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
yield return (IDataRecord)reader;
}
}
}
}
}
例如,如果您只想取前 5 条记录:
var records = CreateQuery("SELECT * FROM ais.country;", Properties.Settings.Default.MySQL).Take(5);
foreach (IDataRecord rec in records)
{
String country = rec.GetString(rec.GetOrdinal("Name"));
}
不隶属于 StackOverflow