0

私は使用しますExecuteReader()。最後の結果のみを返します。tbid_1.Text、などで結果を配列のように表示したかったのtbid_1.Textです。tbid_1.Text

    public void Select(FrmVIRGO frm)
                {

                string query = "SELECT* FROM tb_patient_information ";
                if (this.OpenConnection() == true)
                { //Create Command
                    MySqlCommand cmd = new MySqlCommand(query, connection);
                    //Create a data reader and Execute the command


          MySqlDataReader dataReader = cmd.ExecuteReader();
                        while (dataReader.Read())
                        {

// I think use like this
                       frm.tbid_1.Text = dataReader["id_patient"][1].ToString(); //... id_patient1
                       frm.tbid_2.Text = dataReader["id_patient"][2].ToString(); //... id_patient2
                       frm.tbid_3.Text = dataReader["id_patient"][3].ToString(); //... id_patient3


                        }

                        //close Data Reader
                    dataReader.Close();

                    //close Connection
                    this.CloseConnection();
                    }
            }
4

1 に答える 1

1

コードは、 を呼び出すとdataReader.Read()、インデックスによってすべてのレコードにアクセスできることを期待しているようです。

データ リーダーは のインスタンスです。これはIDataReader、ほとんどの .NET データ アクセス ライブラリが「クエリの結果を読み取る」という概念を表すために使用するインターフェイスです。IDataReader一度に 1 つのレコードにしかアクセスできません。を呼び出すたびに、 は次のレコードdataReader.Read()IDataReader進みます。が返された場合falseは、結果セットの最後に到達したことを意味します。

たとえば、上記のコードを次のように変換できます。

        dataReader.Read();  // dataReader is at 1st record
        frm.tbid_1.Text = dataReader["id_patient"].ToString();

        dataReader.Read();  // dataReader is at 2nd record
        frm.tbid_2.Text = dataReader["id_patient"].ToString();

        dataReader.Read();  // dataReader is at 3rd record
        frm.tbid_3.Text = dataReader["id_patient"].ToString();

これはあなたがすべき方法ではないDataReaderことに注意してください。

正確に 3 つのレコードが返されることが予想される場合は、上記のコードに似たものを使用できます。dataReader.Read()ただし、各レコードからデータを読み取る前にそれが返されることを確認するように変更trueし、意味のある方法で返されない場合を処理します (たとえば、エラーを説明する例外をスローする、エラーをログに記録するなど)。

ただし、一般的に、生の ADO.Net を使用する場合 ( OR/MIDataReaderを使用するのではなく) 、事前に各レコードを辞書に変換し、それらを使用することを好みます。

たとえば、 の次の拡張メソッドを記述できますDataReader

public static class DataReaderExtensions
{
    public static IList<IDictionary<string, object>> ListRecordsAsDictionaries(this IDataReader reader)
    {
        var list = new List<IDictionary<string, object>>();

        while (reader.Read())
        {
            var record = new Dictionary<string, object>();

            for (var i = 0; i < reader.FieldCount; i++)
            {
                var key = reader.GetName(i);
                var value = reader[i];
                record.Add(key, value);
            }

            list.Add(record);
        }

        return list;
    }
}

このメソッドは を繰り返し処理し、IDataReader各行の値を に貼り付けますDictionary<string, object>。生の ADO を扱う場合、このパターンは一般的にかなり有用であることがわかりました。

このアプローチには、いくつかの注意事項があります。

  • サーバーからすべてのデータを受信するまで、レコード (Dictionary インスタンス) にアクセスすることはできません。でレコードが利用可能になるため、レコードを個別にDataReader処理している場合、データの一部がまだ転送中である間に実際にデータの処理を開始できる場合があります。(注: これは、このメソッドIEnumerable<IDictionary<string, object>>を の代わりに返すようにしIList<IDictionary<string, object>>、 を使用yield returnして各レコードが利用可能になったときに生成することで修正できます。)
  • 大規模なデータ セットを反復処理している場合、それほど多くの辞書をインスタンス化したくない場合があります。代わりに、各レコードを個別に処理する方がよい場合があります。
  • レコードについて提供できる情報の一部にアクセスDataReaderできなくなります (たとえば、DataReader.GetDataTypeNameレコードを反復処理しているため使用できません)。
于 2013-04-10T02:18:59.470 に答える