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

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

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

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

Q&A

解決済

1回答

4331閲覧

dataAdapterを使いたい

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

0クリップ

投稿2018/11/02 06:45

編集2018/11/05 01:12

前提・実現したいこと

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

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

C#

1//1 2 if (result == DialogResult.Yes) 3 { 4 String data = dataGridView1.CurrentRow.Cells[0].Value.ToString(); 5 String Namedata = dataGridView1.CurrentRow.Cells[1].Value.ToString(); 6 string connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; 7 8 using (SqlConnection connection = new SqlConnection(connectionString)) 9 using (SqlCommand command = connection.CreateCommand()) 10 { 11 try 12 { 13 14 DataTable dt = new DataTable(); 15 // データベースの接続開始 16 connection.Open(); 17 18 // SQLの設定 19 command.CommandText = "SELECT FROM PostList where PostCode = @postCode and PostName = @postName;"; 20 21 SqlParameter param = command.CreateParameter(); 22 23 param.ParameterName = "@postCode"; 24 param.SqlDbType = SqlDbType.VarChar; 25 param.Direction = ParameterDirection.Input; 26 param.Value = data.ToString(); 27 command.Parameters.Add(param); 28 29 param = command.CreateParameter(); 30 param.ParameterName = "@postName"; 31 param.SqlDbType = SqlDbType.VarChar; 32 param.Direction = ParameterDirection.Input; 33 param.Value = Namedata.ToString(); 34 command.Parameters.Add(param); 35 36 // SQLの実行 37 SqlDataAdapter sda = new SqlDataAdapter(command); 38 sda.Fill(dt); 39 40 MessageBox.Show("正常終了"); 41 42 PostData(); 43 } 44 catch (Exception exception) 45 { 46 MessageBox.Show("異常終了"+exception.Message); 47 } 48 finally 49 { 50 // データベースの接続終了 51 connection.Close(); 52 } 53 54 } 55 } 56 else 57 { 58 MessageBox.Show("処理を中断しました"); 59 60 } 61 62 } 63 }

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

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

C#

1using System; 2using System.Collections.Generic; 3using System.Configuration; 4using System.Data.SqlClient; 5using System.Linq; 6using System.Text; 7using System.Threading.Tasks; 8 9namespace EmployeeSystem.DataAccess 10{ 11 class DBManager 12 { 13 private SqlConnection sqlConnection; 14 private SqlTransaction sqlTransaction; 15 16 17 /// <summary> 18 /// DB接続 19 /// </summary> 20 public DBManager() 21 { 22 // 接続文字列を生成 23 String connectionString = ConfigurationManager.ConnectionStrings["sqlsvr"].ConnectionString; 24 25 // SqlConnection の新しいインスタンスを生成 (接続文字列を指定) 26 this.sqlConnection = new SqlConnection(connectionString); 27 28 // データベース接続を開く 29 this.sqlConnection.Open(); 30 } 31 32 /// <summary> 33 /// DB切断 34 /// </summary> 35 public void Close() 36 { 37 this.sqlConnection.Close(); 38 this.sqlConnection.Dispose(); 39 } 40 41 /// <summary> 42 /// トランザクション開始 43 /// </summary> 44 public void BeginTran() 45 { 46 this.sqlTransaction = this.sqlConnection.BeginTransaction(); 47 } 48 49 /// <summary> 50 /// トランザクション コミット 51 /// </summary> 52 public void CommitTran() 53 { 54 if (this.sqlTransaction.Connection != null) 55 { 56 this.sqlTransaction.Commit(); 57 this.sqlTransaction.Dispose(); 58 } 59 } 60 61 /// <summary> 62 /// トランザクション ロールバック 63 /// </summary> 64 public void RollBack() 65 { 66 if (this.sqlTransaction.Connection != null) 67 { 68 this.sqlTransaction.Rollback(); 69 this.sqlTransaction.Dispose(); 70 } 71 } 72 /// <summary> 73 /// クエリ実行(output項目あり) 74 /// </summary> 75 /// <param name="query"></param> 76 /// <param name="paramDict"></param> 77 /// <returns></returns> 78 public SqlDataReader ExecuteQuery(string query, Dictionary<string, Object> paramDict) 79 { 80 SqlCommand sqlCom = new SqlCommand(); 81 82 //クエリー送信先、トランザクションの指定 83 sqlCom.Connection = this.sqlConnection; 84 sqlCom.Transaction = this.sqlTransaction; 85 86 sqlCom.CommandText = query; 87 foreach (KeyValuePair<string, Object> item in paramDict) 88 { 89 sqlCom.Parameters.Add(new SqlParameter(item.Key, item.Value)); 90 } 91 92 // SQLを実行 93 SqlDataReader reader = sqlCom.ExecuteReader(); 94 95 return reader; 96 } 97 98 /// <summary> 99 /// クエリー実行(OUTPUT項目あり) 100 /// <para name="query">SQL文</para> 101 /// </summary> 102 public SqlDataReader ExecuteQuery(string query) 103 { 104 return this.ExecuteQuery(query, new Dictionary<string, Object>()); 105 } 106 107 /// <summary> 108 /// クエリー実行(OUTPUT項目なし) 109 /// <para name="query">SQL文</para> 110 /// <para name="paramDict">SQLパラメータ</para> 111 /// </summary> 112 public void ExecuteNonQuery(string query, Dictionary<string, Object> paramDict) 113 { 114 SqlCommand sqlCom = new SqlCommand(); 115 116 //クエリー送信先、トランザクションの指定 117 sqlCom.Connection = this.sqlConnection; 118 sqlCom.Transaction = this.sqlTransaction; 119 120 sqlCom.CommandText = query; 121 foreach (KeyValuePair<string, Object> item in paramDict) 122 { 123 sqlCom.Parameters.Add(new SqlParameter(item.Key, item.Value)); 124 } 125 126 // SQLを実行 127 sqlCom.ExecuteNonQuery(); 128 } 129 130 } 131} 132 133

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

C#

1 public void PostNameDropDown() 2 { 3 string CN = String.Empty; 4 DBManager dBManager = new DBManager(); 5 { 6 try 7 { 8 dBManager.BeginTran(); 9 10 string selectSql = @"Select PostName From PostList order by CONVERT(int,PostCode); "; 11 SqlDataReader reader = dBManager.ExecuteQuery(selectSql); 12 13 14 while (reader.Read()) 15 { 16 CN = (string)reader.GetValue(0); 17 18 PostName.Items.Add(CN); 19 } 20 21 } 22 catch (Exception exception) 23 { 24 MessageBox.Show("異常終了" + exception.Message); 25 26 } 27 finally 28 { 29 // データベースの接続終了 30 //connection.Close(); 31 dBManager.Close(); 32 } 33 }

普通の検索は、これで、出来たのですが、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がないので、エラーが起こります。どうすればいいでしょうか。
分かりにくい内容になってしまい、すいませんが、教えて頂きたいです。
よろしくお願いします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2018/11/02 07:05

SqlDataAdapter sda = new SqlDataAdapter(command); と書いてあるのがそのまま使えるのではないですか?
退会済みユーザー

退会済みユーザー

2018/11/02 07:13

すいません、見にくいので、修正します
len_souko

2018/11/02 11:51

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

退会済みユーザー

2018/11/05 01:10

すいませんでした、修正しておきます。
guest

回答1

0

ベストアンサー

C#

1SqlCommand command = connection.CreateCommand()

一番上のソースでこのように書いてあります。
つまり、connection から command が作れます。
connection は DBManager が持っています。

DBManager にメソッドを追加し、テキストを引数にそのメソッドを呼び出すことでコマンドを作るようにすれば良いのではないでしょうか。

投稿2018/11/02 07:22

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/11/02 07:33

ありがとうございました。 無事に解決致しました。 またよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問