質問: command; adapter.Fill(ds); // データセットのレコード件数 MessageBox.Show(ds.Tables[0].Rows.Count.ToString()+"レコード取得しました。"); connection.Close(); } private void dbSearch_Click(object sender, EventArgs e) { // 分からない部分 } } } ``` 上記のソースで「データセットのレコード件数」とコメントしてあるメッセージボックスでは、"3レコード取得しました。"と表示されるので、SQL Serverからデータセットにデータを持ってくる処理はできていると思います。 その次のイベントハンドラ内に書く処理がよく分かりません。 DataSetのインスタンスであるdsの中に、テーブルやカラムを作り、それを使ってレコードを特定する処理を書けば良いかと思ったのですが、イベントハンドラ内でdsと入力しても、上で作ったものとは別のDataSetになってしまいます。 同じクラス内だからdsはイベントハンドラ内でも使えるかと思ったのですが、使えないのでしょうか? また、connection.closeでデータベースとの接続を閉じても、DataSetにはデータは残っているのでしょうか? よく分からないので、お力を貸して頂きたいです。 よろしくお願いします。
回答: 変数のスコープなどごく基本的な知識が不足していると思われます。 C# 変数 スコープ などをキーワードにググってみて、ヒットする記事を読むことをお勧めします。 その知識なしで話が通じるかどうかわかりませんが、一応疑問点に回答すると・・・ > > 同じクラス内だからdsはイベントハンドラ内でも使えるかと思ったのですが、使えないのでしょうか? > > > ds は SqlCall メソッド(コンストラクタもメソッド)内で定義されているのでその中でしか使えません。SqlCall クラス内全体で使えるようにするには、ds の定義を SqlCall メソッドの外に出す、例えば以下のようにしてみてください。 ``` namespace WindowsFormsApp1 { public partial class SqlCall : Form { DataSet ds; public SqlCall() { // ・・・略・・・ ds = new DataSet(); // ・・・略・・・ ``` > > また、connection.closeでデータベースとの接続を閉じても、DataSetにはデータは残っているのでしょうか? > > > 上記のようにすれば、少なくとも SqlCall クラス内では残ってますです。