OLE DB.NET のラッパー

みなさん、こんばんは。最近何かと忙しく、WPF ネタが全然更新できないでいます(汗
ちょっと入り用があり、OLE DB.NET のラッパークラスをちゃちゃっと作ってみました。こんな感じで使います。

string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=test.mdb;";
using (OleDbWrapper wrapper = new OleDbWrapper(connectionString)) {
    OleDbCommand command = new OleDbCommand("SELECT * FROM Employees");
    DataTable dt = wrapper.GetDataTable(command);
    // ・・・・・・
}

以下ソースコード

using System;
using System.Data;
using System.Data.OleDb;


class OleDbWrapper : IDisposable {

    /// <summary>コネクション</summary>
    OleDbConnection _connection;
    /// <summary>トランザクション</summary>
    OleDbTransaction _transaction;
    bool _disposed;

    /// <summary>
    /// コンストラクタ
    /// </summary>
    /// <param name="connectString">接続文字列</param>
    public OleDbWrapper(string connectString) {
            _connection = new OleDbConnection(connectString);
    }

    /// <summary>
    /// リソースを解放します。
    /// </summary>
    /// <param name="disposing"></param>
    protected void Dispose(bool disposing) {

        if (_disposed == false) {
            if (disposing) {
                //
                if (_transaction != null) {
                    _transaction.Dispose();
                }

                if (_connection != null) {
                    this.Close();
                    _connection.Dispose();
                }
            }
            _disposed = true;
        }
    }

    /// <summary>
        /// リソースを解放します。
        /// </summary>
    public void Dispose() {
            this.Dispose(true);
            GC.SuppressFinalize(this);
    }

    /// <summary>
    /// トランザクションを開始します。
    /// </summary>
    public OleDbTransaction BeginTransaction() {

            try {
                _transaction = _connection.BeginTransaction();
            } catch (Exception) {
                throw;
            }
            return _transaction;
    }

    /// <summary>
    /// データベースへの接続を閉じます。
    /// </summary>
    public void Close() {
            try {
                if (_connection != null && 
                    _connection.State == ConnectionState.Open) {
                    _connection.Close();
                }
            } catch (Exception) {
                throw;
            }
    }

    /// <summary>
    /// トランザクション処理をコミットします。
    /// </summary>
    public void Commit() {
            try {
                if (_transaction != null) {
                    _transaction.Commit();
                }
            } catch (Exception) {
                throw;
            }
    }

    /// <summary>
    /// 接続に対して SQL ステートメントを実行し、影響を受けた行数を返します。 
    /// </summary>
    /// <param name="command"><see cref="OleDbCommand">OleDbCommand</see> オブジェクト</param>
    /// <returns>影響を受けた行数</returns>
    public int ExecNonQuery(OleDbCommand command) {

            int ret = 0;
            try {
                command.Connection = _connection;
                if (_transaction != null) {
                    command.Transaction = _transaction;
                }
                ret = command.ExecuteNonQuery();
            } catch (Exception) {
                throw;
            }
            return ret;
    }

    /// <summary>
    /// クエリを実行し、そのクエリが返す結果セットの最初の行にある最初の列を返します。
    /// </summary>
    /// <param name="command"><see cref="OleDbCommand">OleDbCommand</see> オブジェクト</param>
    /// <returns>結果セットの最初の行の最初の列</returns>
    public Object ExecScaler(OleDbCommand command) {

            Object ret = null;
            command.Connection = _connection;
            try {
                if (_transaction != null) {
                    command.Transaction = _transaction;
                }
                ret = command.ExecuteScalar();
            } catch (Exception) {
                throw;
            }
            return ret;
    }

    /// <summary>
    /// データテーブル取得処理
    /// </summary>
    /// <param name="command"><see cref="OleDbCommand">OleDbCommand</see> オブジェクト</param>
    /// <returns><see cref="DataTable">DataTable</see>オブジェクト</returns>
    /// <remarks>
    /// パラメータに渡されたコマンドを実行し、データテーブルを取得します。
    /// </remarks>
    public DataTable GetDataTable(OleDbCommand command) {

            DataTable ret = null;
            try {
                command.Connection = _connection;
                if (_transaction != null) {
                    command.Transaction = _transaction;
                }
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);
                OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
                ret = new DataTable();
                adapter.Fill(ret);

            } catch (Exception) {
                ret = null;
                throw;
            }
            return ret;
    }

    /// <summary>
    /// データベース接続を開きます。 
    /// </summary>
    public void Open() {
            try {
                _connection.Open();
            } catch (Exception) {
                throw;
            }
    }

    /// <summary>
    /// トランザクション処理をロールバックします。
    /// </summary>
    public void Rollback() {

            try {
                if (_transaction != null) {
                    _transaction.Rollback();
                }
            } catch (Exception) {
                throw;
            }
    }

    /// <summary>
    /// データテーブル更新処理
    /// </summary>
    /// <param name="source">更新対象となるデータテーブル</param>
    /// <param name="command"><see cref="OleDbCommand">OleDbCommand</see> オブジェクト</param>
    /// <returns>更新に成功した行数</returns>
    public int Update(DataTable source, OleDbCommand command) {

            int ret = 0;
            try {
                command.Connection = _connection;
                if (_transaction != null) {
                    command.Transaction = _transaction;
                }
                OleDbDataAdapter adapter = new OleDbDataAdapter(command);
                OleDbCommandBuilder builder = new OleDbCommandBuilder(adapter);
                ret = adapter.Update(source);

            } catch (Exception) {
                throw;
            }
            return ret;
    }
}

2010/10/10 追記

コードを少し修正しました。