好的,我的代码目前是:
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))
目前,在这种形式下,当我将读者送回读者时,没有任何价值。我已经介入,并确认在返回时,读者掌握了正确的信息。但读者没有价值观。我可能错过了一些完全愚蠢的东西。但是,任何和所有的帮助将不胜感激。谢谢!
答案 0 :(得分:3)
使用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;
}
答案 1 :(得分:2)
不是返回Datareader
或将所有记录复制到整体返回的内存中DataTable
,而是返回IEnumerable<IDataRecord>
这是DataReader
的基本接口{{ 1}}记录工具。
所以这应该有效,因为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"));
}