ADO.netの最近の情報



最近仕事でC#をメインで使うようになってきたので。

新しいこともいろいろと習得中です。

 

業務アプリケーションにデータベース処理はつきもので、

さらにデータベース処理には、トランザクションがつきもので、

またまたトランザクション処理にはコミットと、ロールバックが・・・

 

今まではどんな言語を使うにしろ、トランザクション処理では、

トランザクションの開始と、コミット、そして例外時にはロールバックと

明示的に記述していた。

 

C#で、SqlTransactionを利用した従来の書き方

using (SqlTransaction tran = con.Begin.Transaction())

{

    try {

        //SQLによるデータベース更新処理

        :

        //コミット

        tran.Commit();

    }

    catch {

        //ロールバック

        tran.Rollback();

    }

}

 

しかし.NET Framework2.0ではもう少し簡単に書けるようになった、

System.Transaction.TransactionScopeクラスが用意されている。

TransactionScope.Complete()メソッドが呼ばれるとコミットされ、

TransactionScope.Dispose()メソッドが呼ばれるとロールバック

される仕組みとのこと。

なので、usingステートメントと組み合わせて、以下のように書ける。

using (TransactionScope tran = new TransactionScope()) {

    //SQLによるデータベース更新処理

    :

    //コミット

    tran.Complete();

}

※例外が発生したり、Complete()メソッドを呼び出さずに、

usingステートメントを抜けると自動的にロールバックされる。

 

また、TransactionScope クラスには自動的にコネクションや、

SqlCommandクラスを検出する機能があるため、今までのように

明示的にコネクションやSqlCommandのインスタンスとトランザクション

のインスタンスを結びつける必要が無くなっているのもポイント。

 

 

ADO.net

ADO.netでは、従来のADOと違い新しいアーキテクチャでのデータアクセスが採用されている。

データソースとの接続に使用されるデータプロバイダ、非接続時でのデータアクセスを可能にするデータセットが用意されている。

 

データプロバイダにて接続型データアクセスを可能にし、必要に応じ、続されたデータソースからデータセットを作成(Fill - 充填)し、非接続のアクセスを可能にするというイメージとなる。

 

接続型データアクセス

1.Connectionオブジェクトにて、データソースとの接続を確立

2.Commandオブジェクトにてテーブルデータの取得、SQLステートメントの実行、プロシージャの呼び出しをおこなう。

3.DataReaderオブジェクトにて結果セットからデータを取得する(結果セットの取得は順方向のみ可能)※この仕様によりパフォーマンスを上げることが可能になる。

4.必要に応じTransactionオブジェクトにてトランザクション制御をおこなう。

 

非接続型データアクセス

※1?2:接続型データアクセスと同様(データソースから結果セットを取得)

1.Connectionオブジェクトにて、データソースとの接続を確立

2.Commandオブジェクトにてテーブルデータの取得、SQLステートメントの実行、プロシージャの呼び出しをおこなう。

3.非接続アクセスをおこなうため、DataAdapterオブジェクトを作成する。

4.DataAdapterオブジェクトにてデータソースから取得した結果セットを、非接続操作が可能な、Datasetオブジェクトに格納(充填)する。※DataAdapter.Fillメソッドを使用する。

5.非接続にてデータの操作をした後、DataAdapter.Updateメソッドにて更新された情報をデータソースへ反映させることが可能。

 

データアクセス

データアクセスは上記のとおり各オブジェクトを用いておこなうが、データソース(データベース)の種類に応じ各オブジェクトを使い分ける。※プログラミングモデルは共通のため同じコーディング方法にてデータアクセスが可能。

SqlConnection    ... SQLServer用

OleDbConnection  ... OLE DB(Access等)用

OracleConnection  ... Oracle用

OdbcConnection   ... ODBCデータソース用

 

同様に、xxxCommand、xxxDataAdapter、xxxTransactionオブジェクトを使い分ける。