UPDATE
データセットへのデータ操作(データの更新)後、DBへのデータ反映(データアダプタのUpdateメソッドによるUPDATE文の実行)を行うサンプルコードです。
using System; using System.Data; using System.Data.Common; namespace SqliteExample { public class ArtificialNewType2Update { public static void Main(string[] args) { if (args.Length != 3) { Console.WriteLine("コマンドライン引数エラー"); Console.WriteLine( "Usage: aupdate2.exe [id] [price] [description]"); return; } string dpstr = "Mono.Data.Sqlite"; string constr = "Data Source=/home/sta/data/TestData.db"; string sstr = "SELECT ProductID, ProductName, " + "Price, ProductDescription " + "FROM Products"; // UPDATE用SQL文字列 string ustr = "UPDATE Products " + "SET Price = @P1, ProductDescription = @P2 " + "WHERE (ProductID = @P3) AND " + "(Price IS NULL OR Price = @P4) AND " + "(ProductDescription IS NULL OR " + "ProductDescription = @P5)"; DbProviderFactory dpf = DbProviderFactories.GetFactory(dpstr); // 1.DBコネクションオブジェクト作成 using (DbConnection dbcon = dpf.CreateConnection()) { dbcon.ConnectionString = constr; dbcon.Open(); try { // トランザクション開始 using (DbTransaction tran = dbcon.BeginTransaction()) // 2.データアダプタオブジェクト作成 using (DbDataAdapter da = dpf.CreateDataAdapter()) // SELECT用コマンドオブジェクト作成 using (DbCommand scmd = dbcon.CreateCommand()) // UPDATE用コマンドオブジェクト作成 using (DbCommand ucmd = 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"]; // 主キーの設定 dt.PrimaryKey = new DataColumn[]{ dt.Columns["ProductID"] }; // 5.データセットへのデータ操作 // パターン1 //DataRow frow = dt.Rows.Find(4); //frow["Price"] = 12; //frow["ProductDescription"] = "ドリル"; // パターン2 DataRow frow = dt.Rows.Find(args[0]); if (frow != null) { frow[2] = args[1]; frow[3] = args[2]; } else { Console.WriteLine("更新対象が存在しません"); return; } // UPDATE用コマンドオブジェクト設定 ucmd.CommandText = ustr; // パラメータ設定 // @P1 DbParameter p1 = ucmd.CreateParameter(); p1.ParameterName = "@P1"; p1.SourceColumn = "Price"; ucmd.Parameters.Add(p1); // @P2 DbParameter p2 = ucmd.CreateParameter(); p2.ParameterName = "@P2"; p2.SourceColumn = "ProductDescription"; ucmd.Parameters.Add(p2); // @P3 DbParameter p3 = ucmd.CreateParameter(); p3.ParameterName = "@P3"; p3.SourceColumn = "ProductID"; ucmd.Parameters.Add(p3); // @P4 DbParameter p4 = ucmd.CreateParameter(); p4.ParameterName = "@P4"; p4.SourceColumn = "Price"; p4.SourceVersion = DataRowVersion.Original; ucmd.Parameters.Add(p4); // @P5 DbParameter p5 = ucmd.CreateParameter(); p5.ParameterName = "@P5"; p5.SourceColumn = "ProductDescription"; p5.SourceVersion = DataRowVersion.Original; ucmd.Parameters.Add(p5); // トランザクションセット ucmd.Transaction = tran; da.UpdateCommand = ucmd; try { // 6.データセットからDBへのデータ反映 da.Update(ds, "Products"); // コミット tran.Commit(); } catch(Exception ex) { // ロールバック tran.Rollback(); Console.WriteLine("更新エラー: {0}", ex.Message); } } } finally { if (dbcon != null) { dbcon.Close(); } } } } } } /* * ビルド: * * gmcs aupdate2.cs -r:System.Data.dll * * 実行: * * mono aupdate2.exe [id] [price] [description] * */
データセットへのデータ操作
事前に主キーの設定を行い、Findメソッドによる更新対象行の確定を行っています。
パラメータ設定
UPDATE用文字列のWHERE句に指定したパラメータの中で、SourceVersionにOriginal値を使用する設定を試してみました。Original値を使用することで、パラメータには、該当カラムのDBからデータセットへデータを格納した時の値が設定されることになります(例:p4.SourceVersion = DataRowVersion.Original)。