質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

解決済

dataAdapterを使いたい

削除済ユーザー
削除済ユーザー

総合スコア0

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

1回答

0評価

0クリップ

3028閲覧

投稿2018/11/02 06:45

編集2022/01/12 10:58

前提・実現したいこと

初心者です。
初めての投稿です。

C#で社員管理のシステムを作っています。
DBと接続するために、下のように書いていました。

C#

//削除 if (result == DialogResult.Yes) { String data = dataGridView1.CurrentRow.Cells[0].Value.ToString(); String Namedata = dataGridView1.CurrentRow.Cells[1].Value.ToString(); string connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; using (SqlConnection connection = new SqlConnection(connectionString)) using (SqlCommand command = connection.CreateCommand()) { try { DataTable dt = new DataTable(); // データベースの接続開始 connection.Open(); // SQLの設定 command.CommandText = "DELETE FROM PostList where PostCode = @postCode and PostName = @postName;"; SqlParameter param = command.CreateParameter(); param.ParameterName = "@postCode"; param.SqlDbType = SqlDbType.VarChar; param.Direction = ParameterDirection.Input; param.Value = data.ToString(); command.Parameters.Add(param); param = command.CreateParameter(); param.ParameterName = "@postName"; param.SqlDbType = SqlDbType.VarChar; param.Direction = ParameterDirection.Input; param.Value = Namedata.ToString(); command.Parameters.Add(param); // SQLの実行 SqlDataAdapter sda = new SqlDataAdapter(command); sda.Fill(dt); MessageBox.Show("正常終了"); PostData(); } catch (Exception exception) { MessageBox.Show("異常終了"+exception.Message); } finally { // データベースの接続終了 connection.Close(); } } } else { MessageBox.Show("処理を中断しました"); } } }

これで、取りたいデータの取得は出来ていたのですが、
このプログラムをDBから値を取得する部分について、別クラスに分けるように
作り直したいと思いました。

そのために、ネットで調べて、下のクラスを作りました。

C#

using System; using System.Collections.Generic; using System.Configuration; using System.Data.SqlClient; using System.Linq; using System.Text; using System.Threading.Tasks; namespace EmployeeSystem.DataAccess { class DBManager { private SqlConnection sqlConnection; private SqlTransaction sqlTransaction; /// <summary> /// DB接続 /// </summary> public DBManager() { // 接続文字列を生成 String connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; // SqlConnection の新しいインスタンスを生成 (接続文字列を指定) this.sqlConnection = new SqlConnection(connectionString); // データベース接続を開く this.sqlConnection.Open(); } /// <summary> /// DB切断 /// </summary> public void Close() { this.sqlConnection.Close(); this.sqlConnection.Dispose(); } /// <summary> /// トランザクション開始 /// </summary> public void BeginTran() { this.sqlTransaction = this.sqlConnection.BeginTransaction(); } /// <summary> /// トランザクション コミット /// </summary> public void CommitTran() { if (this.sqlTransaction.Connection != null) { this.sqlTransaction.Commit(); this.sqlTransaction.Dispose(); } } /// <summary> /// トランザクション ロールバック /// </summary> public void RollBack() { if (this.sqlTransaction.Connection != null) { this.sqlTransaction.Rollback(); this.sqlTransaction.Dispose(); } } /// <summary> /// クエリ実行(output項目あり) /// </summary> /// <param name="query"></param> /// <param name="paramDict"></param> /// <returns></returns> public SqlDataReader ExecuteQuery(string query, Dictionary<string, Object> paramDict) { SqlCommand sqlCom = new SqlCommand(); //クエリー送信先、トランザクションの指定 sqlCom.Connection = this.sqlConnection; sqlCom.Transaction = this.sqlTransaction; sqlCom.CommandText = query; foreach (KeyValuePair<string, Object> item in paramDict) { sqlCom.Parameters.Add(new SqlParameter(item.Key, item.Value)); } // SQLを実行 SqlDataReader reader = sqlCom.ExecuteReader(); return reader; } /// <summary> /// クエリー実行(OUTPUT項目あり) /// <para name="query">SQL文</para> /// </summary> public SqlDataReader ExecuteQuery(string query) { return this.ExecuteQuery(query, new Dictionary<string, Object>()); } /// <summary> /// クエリー実行(OUTPUT項目なし) /// <para name="query">SQL文</para> /// <para name="paramDict">SQLパラメータ</para> /// </summary> public void ExecuteNonQuery(string query, Dictionary<string, Object> paramDict) { SqlCommand sqlCom = new SqlCommand(); //クエリー送信先、トランザクションの指定 sqlCom.Connection = this.sqlConnection; sqlCom.Transaction = this.sqlTransaction; sqlCom.CommandText = query; foreach (KeyValuePair<string, Object> item in paramDict) { sqlCom.Parameters.Add(new SqlParameter(item.Key, item.Value)); } // SQLを実行 sqlCom.ExecuteNonQuery(); } } }

このコードを使ってみたのが、下のコードです

C#

public void PostNameDropDown() { string CN = String.Empty; DBManager dBManager = new DBManager(); { try { dBManager.BeginTran(); string selectSql = @"Select PostName From PostList order by CONVERT(int,PostCode); "; SqlDataReader reader = dBManager.ExecuteQuery(selectSql); while (reader.Read()) { CN = (string)reader.GetValue(0); PostName.Items.Add(CN); } } catch (Exception exception) { MessageBox.Show("異常終了" + exception.Message); } finally { // データベースの接続終了 //connection.Close(); dBManager.Close(); } }

普通の検索は、これで、出来たのですが、dataAdapterをどうすれば、使えるのかが、分かりませんでした。

public void PostData() { // 接続文字列の取得 DBManager dBManager = new DBManager(); { try { DataTable dt = new DataTable(); // データベースの接続開始 dBManager.BeginTran(); // SQLの設定 String selectSql = "Select * From PostList order by CONVERT (int,PostCode);"; SqlDataReader reader = dBManager.ExecuteQuery(selectSql); // SQLの実行 SqlDataAdapter sda = new SqlDataAdapter(command); sda.Fill(dt); dataGridView1.DataSource = dt; } catch (Exception exception) { MessageBox.Show("異常終了" + exception.Message); } finally { // データベースの接続終了 dBManager.Close(); } } }

上のコードでは、SqlDataAdapter sda = new SqlDataAdapter(command);でcommandがないので、エラーが起こります。どうすればいいでしょうか。
分かりにくい内容になってしまい、すいませんが、教えて頂きたいです。
よろしくお願いします。

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

Zuishin
Zuishin

2018/11/02 07:05

SqlDataAdapter sda = new SqlDataAdapter(command); と書いてあるのがそのまま使えるのではないですか?
len_souko
len_souko

2018/11/02 11:51

質問内容とは関係ありませんが、一つ目のソースコードにあるSQL文、DELETEなので質問の文章とはつじつまが合っていません。後々同じような内容で見に来た人が混乱するかもしれませんのでSELECT文に直した方が良くありませんか?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。