リーダーが閉じられる前に 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))
現在、この形式では、リーダーをリーダーに戻すと、値がありません。私はステップスルーして、リターンの時点でリーダーに正しい情報が含まれていることを確認しました。しかし、読者には価値観がありません。おそらく完全にばかげた何かを見逃しています。しかし、これに関してあらゆる助けをいただければ幸いです。ありがとう!
解決
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