VB6開発者向け:C#で始める.NETプログラミング

第6回 オブジェクト指向プログラミング(1)

この記事を読むのに必要な時間:およそ 8 分

データアクセスするクラスを作る

最初にデータアクセスクラスを作成してみましょう。 前回作成したコードを元に簡単に作成できます。

ソリューションエクスプローラーのプロジェクト名で右クリック後,⁠追加⁠⁠→⁠クラス]によってAdapterという新しいクラスを追加することで,新しいAdapterクラス用のファイルが追加されるとともに,Adapterクラスのコードエディタが画面に表示されます。

Adapterクラスは,データベースの操作に関する処理のみを受け持ちます。 コードは,以下のようになります。

なお,データを格納するためのRowオブジェクトが既に含まれていますが,Rowクラスは後で作成します。

using System.Data;
using System.Data.OleDb; // 追加
namespace WindowsFormsApplication1
{
    //*************************************************************
    /// <summary>電話帳サンプルデータベース操作クラス</summary>
    //*************************************************************
    class Adapter
    {
        private const string FILENAME = "c:\\Common\\Database.mdb";

        //*************************************************************
        /// <summary>レコードを追加します</summary>
        /// <param name="code">番号</param>
        //*************************************************************
        public void Add(int code) {
            string sqlText = this.GetAddSqlText(code);
            this.ExecuteQuery(sqlText);
        }

        //*************************************************************
        /// <summary>レコードを更新します</summary>
        /// <param name="row">Row オブジェクト</param>
        //*************************************************************
        public void Update(Row row) {
            string sqlText = this.GetUpdateSqlText(
                row.Code, row.Name, row.TelephoneNumber);
            this.ExecuteQuery(sqlText);
        }

        //*************************************************************
        /// <summary>レコードを削除します</summary>
        /// <param name="code">番号</param>
        //*************************************************************
        public void Delete(int code) {
            string sqlText = this.GetDeleteSqlText(code);
            this.ExecuteQuery(sqlText);
        }

        //*************************************************************
        /// <summary>レコードを読み込みます</summary>
        /// <param name="code">番号</param>
        /// <param name="row">Row オブジェクト</param>
        //*************************************************************
        public bool Read(int code, Row row) {
            using (OleDbConnection cn = this.CreateDbConnection()) {
                using (OleDbCommand cd = new OleDbCommand()) {
                    cd.Connection = cn;
                    cd.CommandType = CommandType.Text;
                    cd.CommandText = this.GetSelectSqlText(code);
                    using (OleDbDataReader dr = cd.ExecuteReader()) {
                        if (!dr.Read()) return false;
                        row.Code = dr.GetInt32(0);
                        row.Name = dr.GetString(1);
                        row.TelephoneNumber = dr.GetString(2);
                        return true;
                    }
                }
            }
        }

        //*************************************************************
        /// <summary>各 SQL 文字列を取得します</summary>
        /// <param name="code">番号</param>
        /// <returns>SQL 文字列</returns>
        //*************************************************************
        private string GetSelectSqlText(int code) {
            string s = code.ToString();
            return "SELECT * FROM MyTable WHERE 番号 = " + s;
        }

        private string GetAddSqlText(int code) {
            return
                "INSERT INTO MyTable(番号, 名前, 電話番号) VALUES(" +
                code.ToString() + ", '' , '')";
        }

        private string GetUpdateSqlText(
            int code, string nameValue, string telephoneNumber)
        {
            return
                "UPDATE MyTable " +
                "Set " +
                    "名前 = '" + nameValue + "', " +
                    "電話番号 = '" + telephoneNumber + "' " +
                "WHERE 番号 = " + code.ToString();
        }

        private string GetDeleteSqlText(int code) {
            string s = code.ToString();
            return "DELETE * FROM MyTable WHERE 番号 = " + s;
        }

        //*************************************************************
        /// <summary>クエリーを実行します</summary>
        /// <param name="sqlText">実行したい SQL 文字列</param>
        /// <returns>結果 [True:成功 / False:失敗]</returns>
        //*************************************************************
        private void ExecuteQuery(string sqlText) {
            using (OleDbConnection cn = this.CreateDbConnection()){
                using (OleDbCommand cd = new OleDbCommand()) {
                    cd.Connection = cn;
                    cd.CommandType = CommandType.Text;
                    cd.CommandText = sqlText;
                    cd.ExecuteNonQuery();
                }
            }
        }

        //*************************************************************
        /// <summary>DB接続オブジェクトを取得します</summary>
        //*************************************************************
        private OleDbConnection CreateDbConnection() {
            OleDbConnection r = new OleDbConnection();
            r.ConnectionString = this.GetConnectionString();
            r.Open();
            return r;
        }

        //*************************************************************
        /// <summary>データベースへの接続文字列を取得します</summary>
        //*************************************************************
        private string GetConnectionString() {
            return
                "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" +
                FILENAME;
        }
    }
}

著者プロフィール

伊藤達也(いとうたつや)

(株)井沢電器設備にて、業務管理システムの開発に従事しています。 この記事の趣旨通り、筆者自身が2005年後半にメインの開発言語をVB6からC#に移行し、2007年には Microsoft MVPアワードをC#で受賞しました。