プログラミングのメモ

プログラミングの学び直し備忘録

C#:ADO(接続型)

DB接続

DB接続/状態確認/CLOSE

cnstr :
cn(cnstr)
cn → cn.Open
cn → cn.State
cn → cn.Close

        private void DB接続_状態確認()
        {

            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());

            try
            {
                cn.Open();
                System.Windows.Forms.MessageBox.Show($"接続状態 : {cn.State}", "通知");



                cn.Close();
                System.Windows.Forms.MessageBox.Show($"接続状態 : {cn.State}", "通知");
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
            }

        }

スキーマ

スキーマ(schema):データベースの構造

テーブルリスト (cn.GetOleDbSchemaTable)

cnstr :
cn(cnstr)
cn → cn.Open
■DataTable dt = cn.GetOleDbSchemaTable
cn → cn.Close

dt.Rows()["TABLE_NAME"]

        //#####################################################
        /// <summary>
        /// テーブルリスト
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //#####################################################
        private void btn_テーブルリスト_Click(object sender, EventArgs e)
        {
            DataTable dt = mth_テーブルリスト();
            this.dgv.DataSource = dt;

            this.dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
        }

        /// ***************************************************
        /// <summary>
        ///  テーブルリスト
        /// </summary>
        /// ***************************************************
        private DataTable mth_テーブルリスト()
        {

            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());

            cn.Open();

            //---------------------------------------------------------------
            // TBリスト ⇒ 「OleDbSchemaGuid.Tables」
            // - OleDbSchemaGuid クラス
            // - Tables フィールド
            //---------------------------------------------------------------
            /*
             * 「OleDbSchemaGuid」は、結果を「DataTable」で返す。
             * 「DataTable」は、1テーブルの情報を1レコードとしてテーブルごとの情報が格納されている
             *  このうち、テーブル名は3番目の[TABLE_NAME]フィールドに格納されている
             *  https://docs.microsoft.com/ja-jp/dotnet/api/system.data.oledb.oledbschemaguid.tables?view=dotnet-plat-ext-3.1
             *  
             */
            //DataTable dt = new DataTable();
            DataTable dt = cn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables,
                                            new object[] { null, null, null, "TABLE" }
                                            );

            cn.Close();

            foreach (DataRow dr in dt.Rows)
            {
                //Console.WriteLine(string.Join(",", dr.ItemArray));
                //Console.WriteLine(dr[2]);
                Console.WriteLine(dr["TABLE_NAME"]);
            }

            return dt;

        }

フィールドリスト (cn.GetOleDbSchemaTable)

cnstr :
cn(cnstr)
cn → cn.Open
■DataTable dt = cn.GetOleDbSchemaTable
cn → cn.Close

dt.Rows().["COLUMN_NAME"]

        //#####################################################
        /// <summary>
        /// フィールドリスト
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //#####################################################
        private void btn_フィールドリスト_Click(object sender, EventArgs e)
        {
            DataTable dt = mth_257_フィールドリスト();
            this.dgv.DataSource = dt;

            this.dgv.Font = new Font("Arial", 8.00F, FontStyle.Regular);
            this.dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

        }

        /// ************************************************************
        /// <summary>
        /// フィールドリスト
        /// </summary>
        /// <returns></returns>
        /// ************************************************************
        private DataTable mth_フィールドリスト()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // [社員]テーブル のFLDリスト ⇒ 「OleDbSchemaGuid.Columns」
            // - OleDbSchemaGuid クラス
            // - Columns フィールド
            //---------------------------------------------------------------
            /*
             * 「OleDbSchemaGuid」は、結果を「DataTable」で返す。
             * 「DataTable」は、1テーブルの情報を1レコードとしてテーブルごとの情報が格納されている
             *  このうち、フィールド名は4番目の[COLUMN_NAME]フィールドに格納されている
             *  https://docs.microsoft.com/ja-jp/dotnet/api/system.data.oledb.oledbschemaguid.columns?view=dotnet-plat-ext-3.1
             */
            DataTable dt = cn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Columns,
                                            new object[] { null, null, "Employees", null }
                                            );

            cn.Close();


            foreach (DataRow dr in dt.Rows)
            {
                Console.WriteLine(dr[3]);
                Console.WriteLine(dr["COLUMN_NAME"]);
            }

            return dt;
        }

テーブル

テーブル作成 (CREATE TABLE)

cnstr :
cn(cnstr)
cn → cn.Open
■ sSQL = "CREATE TABLE TB_テスト(コード INT, 商品名 TEXT"
■ OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);
■cmd.ExecuteNonQuery
cn → cn.Close

※cmd.ExecuteNonQuery
接続に対して Transact-SQL ステートメントを実行し、影響を受けた行数を返します。

        //*********************************************
        /// <summary>
        /// テーブル作成
        /// </summary>
        //*********************************************
        private void mth_テーブル作成()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // TB 作成
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteNonQuery」で実行
             */

            string sSQL = "";
            sSQL += "CREATE TABLE テスト(コード INT, 商品名 TEXT)";

            try
            {
                // Connection + SQL
                var cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

                // ExecuteNonQuery
                cmd.ExecuteNonQuery();
                System.Windows.Forms.MessageBox.Show("Create TB", "通知");

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
            }
            finally
            {
                cn.Close();
            }


        }

テーブル削除 (DROP TABLE)

cnstr :
cn(cnstr)
cn → cn.Open
■ sSQL = "DROP TABLE TB_テスト";
■ OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);
■cmd.ExecuteNonQuery
cn → cn.Close

※cmd.ExecuteNonQuery
接続に対して Transact-SQL ステートメントを実行し、影響を受けた行数を返します。

        //******************************************
        /// <summary>
        /// テーブル削除
        /// </summary>
        //******************************************
        private void mth_テーブル削除()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // TB 削除
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteNonQuery」で実行
             */
            string sSQL = "";
            sSQL += "DROP TABLE TB_テスト";

            try
            {
                // Connection + SQL
                var cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

                // ExecuteNonQuery
                cmd.ExecuteNonQuery();
                System.Windows.Forms.MessageBox.Show("Delete TB", "通知");

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
            }
            finally
            {
                cn.Close();
            }


        }

レコード

レコート追加(INSERT)

cnstr :
cn(cnstr)
cn → cn.Open
■ sSQL = "INSERT INTO 社員 VALUES(20201101, 'Bob, 'SEC-001')";
■ OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);
■cmd.ExecuteNonQuery
cn → cn.Close

※cmd.ExecuteNonQuery
接続に対して Transact-SQL ステートメントを実行し、影響を受けた行数を返します。

        //#####################################################
        /// <summary>
        /// レコード追加
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //#####################################################
        private void btn_レコード追加_Click(object sender, EventArgs e)
        {
            mth_レコード追加();
        }

        //******************************************
        /// <summary>
        /// レコード追加
        /// </summary>
        //******************************************
        private void mth_レコード追加()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // Add Record
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteNonQuery」で実行
             */
            string sSQL = "";
            sSQL += "INSERT INTO 社員 VALUES(20201101, 'Bob, 'SEC-001')";

            //string sSQL = "";
            sSQL = "INSERT INTO TB_社員 ([社員番号], [氏名], [部門コード])" ;
            sSQL += " VALUES(20201101, 'Bob', 'SEC-001')";

            try
            {
                // Connection + SQL
                OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

                // ExecuteNonQuery
                cmd.ExecuteNonQuery();
                System.Windows.Forms.MessageBox.Show("Add Record", "通知");

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
            }
            finally
            {
                cn.Close();
            }


        }

レコード更新 (UPDATE)

cnstr :
cn(cnstr)
cn → cn.Open
■ sSQL = "UPDATE TB_社員 SET 氏名 ='Jon' WHERE 社員番号=20201010";
■ OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);
■cmd.ExecuteNonQuery
cn → cn.Close

※cmd.ExecuteNonQuery
接続に対して Transact-SQL ステートメントを実行し、影響を受けた行数を返します。

        //#####################################################
        /// <summary>
        /// レコード更新
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //#####################################################
        private void btn_レコード更新_Click(object sender, EventArgs e)
        {
            mth_レコード更新();
        }

        //*********************************************
        /// <summary>
        /// レコード更新
        /// </summary>
        //*********************************************
        private void mth_レコード更新()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // Update Record
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteNonQuery」で実行
             */
            string sSQL = "";
            sSQL += "UPDATE TB_社員 SET 氏名 ='Jon' WHERE 社員番号=20201010";

            sSQL = "UPDATE TB_社員";
            sSQL += " SET 氏名 ='Jon'";
            sSQL += " WHERE 社員番号=20201010";

            try
            {
                // Connection + SQL
                var cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

                // ExecuteNonQuery
                cmd.ExecuteNonQuery();
                System.Windows.Forms.MessageBox.Show("Update Record", "通知");

            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
            }
            finally
            {
                cn.Close();
            }


        }

レコード削除 (DELETE)

cnstr :
cn(cnstr)
cn → cn.Open
■ sSQL = "UPDATE TB_社員 SET 氏名 ='Jon' WHERE 社員番号=20201010";
■ OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);
■cmd.ExecuteNonQuery
cn → cn.Close

※cmd.ExecuteNonQuery
接続に対して Transact-SQL ステートメントを実行し、影響を受けた行数を返します。

        //#####################################################
        /// <summary>
        /// レコード削除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //#####################################################
        private void btn_レコード削除_Click(object sender, EventArgs e)
        {
            mth_レコード削除();
        }

        //********************************************
        /// <summary>
        /// レコード削除
        /// </summary>
        //********************************************
        private void mth_レコード削除()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // Delete Record
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteNonQuery」で実行
             */
            string sSQL = "";
            sSQL += "DELETE FROM TB_社員 WHERE 社員番号=20201010";

            try
            {
                // Connection + SQL
                var cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

                // ExecuteNonQuery
                cmd.ExecuteNonQuery();
                System.Windows.Forms.MessageBox.Show("Delete Record", "通知");
            }
            catch (Exception ex)
            {
                System.Windows.Forms.MessageBox.Show(ex.Message, "通知");
            }
            finally
            {
                cn.Close();
            }
        }

レコード参照 (SELECT)

cnstr :
cn(cnstr)
cn → cn.Open
■ sSQL = "SELECT * FROM TB_社員";
■ OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);
■cmd.ExecuteReader
■while (dr.Read())

cn → cn.Close

※cmd.ExecuteReader
Readメソッドを何度か呼び出したあと、最後のレコードに達して、現在のレコードをそれ以上進めることができない場合にReadメソッドはfalseを返す

        //#####################################################
        /// <summary>
        /// レコード参照
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //#####################################################
        private void btn_レコード参照_Click(object sender, EventArgs e)
        {
            mth_レコード参照();
        }

        //*************************************
        /// <summary>
        /// レコード参照
        /// </summary>
        //*************************************
        private void mth_レコード参照()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // Select Record ⇒ cmd.ExecuteReader
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteReader」で実行(レコード取得)
             *  Readメソッドで1件ずつ参照
             */
            string sSQL = "";
            sSQL += "SELECT * FROM TB_社員";

            // Connection + SQL
            OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

            // ExecuteReader
            OleDbDataReader dr = cmd.ExecuteReader();

            while (dr.Read())
            {
                //Console.WriteLine($"{dr.GetInt32(0)} : {dr.GetString(1)}");
                Console.WriteLine("{0}, {1}, {2}", dr["社員番号"], dr["氏名"], dr["部門コード"]);
            }

            dr.Close();
            cn.Close();
        }

レコード数 (SELECT COUNT(*))

cnstr :
cn(cnstr)
cn → cn.Open
■ sSQL ="SELECT COUNT(*) FROM 社員";
■ OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);
■int num = (int)cmd.ExecuteScalar();

cn → cn.Close

※cmd.ExecuteScalar
クエリを実行し、クエリによって返される結果セットの先頭行の最初の列を返します。 その他の列または行は無視されます。

        //#####################################################
        /// <summary>
        /// レコード数
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        //#####################################################
        private void btn_レコード数_Click(object sender, EventArgs e)
        {
            mth_レコード数();
        }

        //**************************************
        /// <summary>
        /// レコード数
        /// </summary>
        //**************************************
        private void mth_レコード数()
        {
            OleDbConnectionStringBuilder cnstr = new OleDbConnectionStringBuilder();
            cnstr["Provider"] = _sProvider;
            cnstr["Data Source"] = _sDataSorce;
            cnstr["Jet OLEDB:Database Password"] = _sPass;

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            //---------------------------------------------------------------
            // COUNT(*) Record ⇒ cmd.ExecuteScalar
            //---------------------------------------------------------------
            /*
             * SQLで「OleDbConnection」を生成
             * 「ExecuteReader」で実行(レコード取得)
             *  ExecuteScalarメソッドで参照
             *  ・ExecuteScalarメソッド
             *    結果を1件だけ返す。レコード数、集計地など単一結果を返す時に使用
             */
            string sSQL = "";
            sSQL += "SELECT COUNT(*) FROM TB_社員";

            // Connection + SQL
            OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

            // ExecuteScalar
            int num = (int)cmd.ExecuteScalar();

            cn.Close();

            System.Windows.Forms.MessageBox.Show(num + "件のレコードがあります。", "通知");

        }

フィールド数 (cmd.ExecuteReader.FieldCount)

            OleDbConnection cn = new OleDbConnection(cnstr.ToString());
            cn.Open();

            string sSQL = "";
            sSQL += "SELECT * FROM テーブル";

            // Connection + SQL
            OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(sSQL, cn);

            // ExecuteReader
            OleDbDataReader dr = cmd.ExecuteReader();
            System.Windows.Forms.MessageBox.Show(dr.FieldCount + "フィールドがあります。", "通知");

            dr.Close();
            cn.Close();

フィールド名