はじめに
前回に引き続き、MonoでSQLiteを使ったデータベース(以下DB)アクセスについて解説します。基本設定等については前回の記事を参照してください。
6.DBアクセスーデータアダプタ編
データアダプタを使用した、DBに対して間接的なデータ操作を行うサンプルコード(C#)について解説します。
間接的たる所以は、
- データアダプタのFillメソッドによるDBからデータセットへのデータ格納
- データセットへのデータ操作(行挿入、データの更新、行削除)
- データアダプタのUpdateメソッドによるデータセットからDBへのデータ反映
という処理の流れを組むためです。
サンプルコードの簡単な処理の流れとしては以下になります。
- DBコネクションオブジェクト作成
- データアダプタオブジェクト作成
- データセットオブジェクト作成
- データセットへのデータ格納
- データセットへのデータ操作
- データセットからDBへのデータ反映
データアダプタ編基本
データセットへのデータ格納(データアダプタのFillメソッドによるSELECT文の実行)を行うサンプルコードについて解説します。
プロバイダファクトリ未使用
using System; using System.Data; using Mono.Data.Sqlite; namespace SqliteExample { public class ArtificialNewType { public static void Main(string[] args) { string constr = "Data Source=/home/sta/data/TestData.db"; string sstr = "SELECT ProductID, ProductName, " + "Price, ProductDescription " + "FROM Products"; // 1.DBコネクションオブジェクト作成 using (SqliteConnection dbcon = new SqliteConnection(constr)) { // 2.データアダプタオブジェクト作成 using (SqliteDataAdapter da = new SqliteDataAdapter(sstr, dbcon)) // 3.データセットオブジェクト作成 using (DataSet ds = new DataSet()) { // 4.データセットへのデータ格納 da.Fill(ds, "Products"); DataTable dt = ds.Tables["Products"]; foreach (DataRow dr in dt.Rows) { Console.WriteLine( "ID:{0} NAME:{1} PRICE:{2} DESCRIPTION:{3}", dr[0], dr[1], dr[2], dr[3]); } } } } } } /* * ビルド: * * gmcs anew.cs -r:System.Data.dll -r:Mono.Data.Sqlite.dll * * 実行: * * mono anew.exe * */
プロバイダファクトリ使用
using System; using System.Data; using System.Data.Common; namespace SqliteExample { public class ArtificialNewType2 { public static void Main(string[] args) { string dpstr = "Mono.Data.Sqlite"; string constr = "Data Source=/home/sta/data/TestData.db"; string sstr = "SELECT ProductID, ProductName, " + "Price, ProductDescription " + "FROM Products"; // DBプロバイダファクトリ作成 DbProviderFactory dpf = DbProviderFactories.GetFactory(dpstr); // 1.DBコネクションオブジェクト作成 using (DbConnection dbcon = dpf.CreateConnection()) { dbcon.ConnectionString = constr; // 2.データアダプタオブジェクト作成 using (DbDataAdapter da = dpf.CreateDataAdapter()) // SELECT用コマンドオブジェクト作成 using (DbCommand scmd = dbcon.CreateCommand()) // 3.データセットオブジェクト作成 using (DataSet ds = new DataSet()) { // SELECT用コマンドオブジェクト設定 scmd.CommandText = sstr; da.SelectCommand = scmd; // 4.データセットへのデータ格納 da.Fill(ds, "Products"); DataTable dt = ds.Tables["Products"]; foreach (DataRow dr in dt.Rows) { Console.WriteLine( "ID:{0} NAME:{1} PRICE:{2} DESCRIPTION:{3}", dr[0], dr[1], dr[2], dr[3]); } } } } } } /* * ビルド: * * gmcs anew2.cs -r:System.Data.dll * * 実行: * * mono anew2.exe * */
プロバイダファクトリを使用しないanew.csの方がよりシンプルな記述が可能ですが、今記事ではより汎用的ということでanew2.csを基にしたサンプルコードについて解説します。
anew2.csでは明示的にデータアダプタのSelectCommandプロパティにコマンドオブジェクトを設定しています(anew.csではデータアダプタオブジェクト作成時にコンストラクタの引数としてSELECT文、コネクションオブジェクトを渡すことで、明示的な設定は必要なし)。