切断モードでADO.Netを操作する方法

MicrosoftのADO.Netデータアクセスフレームワークは、20年以上にわたって使用されています。ADO.Netを活用して、.NetCLRの管理環境からさまざまなデータベースでCRUD操作を実行できます。

データプロバイダーは、管理対象環境から基盤となるデータベースに接続して対話するために使用されるプロトコルをカプセル化するソフトウェアコンポーネントです。人気のあるデータプロバイダーには、SQL Serverデータプロバイダー、Oracleデータプロバイダー、OLEDBデータプロバイダーなどがあります。ADO.Netは、接続モードと切断モードの両方で機能します。

ADO.Netの接続された操作モードは、基になるデータベースへの接続が操作の存続期間を通じて存続しているモードです。一方、切断された操作モードは、ADO.Netが基になるデータベースからデータを取得し、取得したデータを一時的にメモリに格納してから、データベースへの接続を閉じるモードです。

切断モードの操作でADO.Netを操作する場合、通常はDataAdapter、DataSet、DataTable、およびDataTableReaderを利用します。DataAdapterはアプリケーションとデータベース間のブリッジとして機能しますが、DataSetはメモリ内の切断されたデータベースの表現であり、1つ以上のDataTableインスタンスを含めることができます。DataTableReaderは、切断モードで動作することを除いて、DataReaderに似ています。

いくつかのコードを掘り下げてみましょう

十分な概念があります。コードを見てみましょう。次のコードスニペットは、切断モードでデータベースからデータを取得する方法を示しています。この例は、説明のみを目的としてAdventureWorksデータベースに接続していることに注意してください。

static void Main(string[] args)

        {

            string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataSet dataSet = new DataSet();

                    sqlDataAdapter.Fill(dataSet);

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

        }

上記のコードリストでは、データベースへの接続はSqlConnectionクラスのインスタンスを使用して確立されます。次に、DataAdapterインスタンスが作成され、DataAdapterクラスのFill()メソッドを使用してDataSetインスタンスにデータを設定するために使用されます。Dispose()メソッドがSqlConnectionインスタンスで自動的に呼び出されるため、コントロールが「using」ブロックから出ると、データベースへの接続は自動的に閉じられます。DataSetインスタンスに格納されたデータはメモリに常駐し、DataSetは切断モードで動作するため、アクティブなデータベース接続に依存しません。データがデータベースから取得され、DataSetインスタンスのメモリに格納されたら、必要に応じてデータを変更し、必要に応じてデータを再度永続化することもできます。

DataRow dataRow = dataSet.Tables[0].NewRow(); //Creates a new data row

//You can now 指定する values for each of the columns of the data row

dataSet.Tables[0].Rows.Add(dataRow); //Add the data row

sqlDataAdapter.Update(dataSet); // Inserts a new record

IDisposableインターフェースを実装するタイプで「using」ブロックを使用できることに注意してください。「using」ブロック全体がtry-catchブロック内にラップされ、プログラムの実行中に発生する可能性のある例外を処理します。この例の接続文字列は構成ファイルから取得されることに注意してください。アプリケーションのコードから接続文字列を分離することをお勧めします。必要に応じて、接続文字列を暗号化することもできます。

DataSetに入力するのとほぼ同じ方法でDataTableに入力することもできます。これを説明する例を次に示します。

string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);                   

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

DataTableReaderは、両方の長所を組み合わせたものです。つまり、切断モードで動作するDataReaderのようなものであり、DataTableとDataReaderの両方よりも高速です。DataTableReaderを作成するには、DataTableインスタンスでCreateDataReader()メソッドを呼び出すだけです。

DataTableReader dataTableReader = dataTable.CreateDataReader();

次のコードリストは、DataTableReaderを使用してすべての部門の名前を表示する方法を示しています。

static void Main(string[] args)

        {

            string connectionString = ConfigurationManager.ConnectionStrings["AdventureWorksDB"].ConnectionString;

            try

            {

                using (SqlConnection sqlConnection = new SqlConnection(connectionString))

                {

                    sqlConnection.Open();

                    SqlDataAdapter sqlDataAdapter = new SqlDataAdapter("SELECT *  FROM [AdventureWorks2014].[HumanResources].[Department]", sqlConnection);

                    DataTable dataTable = new DataTable();

                    sqlDataAdapter.Fill(dataTable);

                    DataTableReader dataTableReader = dataTable.CreateDataReader(); 

                    while(dataTableReader.Read())

                    {

                        Console.WriteLine(dataTableReader["Name"].ToString());

                    }      

                }                

            }

            catch (Exception ex)

            {

                //Write code here to handle exception

            }

            Console.Read();

        }