3

さて、私のコードは現在:

    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))

現在、この形式でリーダーをリーダーに戻すと、値はありません。私はステップスルーし、リターンの時点で、リーダーが正しい情報を持っていることを確認しました. しかし、読者には価値がありません。私はおそらく完全にばかげた何かを見逃しています。しかし、これに関するすべての助けをいただければ幸いです。ありがとう!

4

2 に答える 2

4

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;
    }
于 2012-07-25T21:04:22.717 に答える
2

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"));
}
于 2012-07-25T21:18:45.383 に答える