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

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

ただいまの
回答率

90.47%

  • C#

    9238questions

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

dataAdapterを使いたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 555

syosinn

score 6

 前提・実現したいこと

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

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

//1
   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 = "SELECT 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から値を取得する部分について、別クラスに分けるように
作り直したいと思いました。

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

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();
        }

    }
}

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

 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ページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

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

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

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

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • syosinn

    2018/11/02 16:13

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

    キャンセル

  • len_souko

    2018/11/02 20:51

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

    キャンセル

  • syosinn

    2018/11/05 10:10

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

    キャンセル

回答 1

checkベストアンサー

+1

SqlCommand command = connection.CreateCommand()


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/02 16:33

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

    キャンセル

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

  • ただいまの回答率 90.47%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

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

  • C#

    9238questions

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