質問

さて、私のコードは現在次のとおりです。

    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"));
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top