DELETE
データセットへのデータ操作(行削除)後、DBへのデータ反映(データアダプタのUpdateメソッドによるDELETE文の実行)を行うサンプルコードです。
using System; using System.Configuration; // 追加 using System.Data; using System.Data.Common; namespace SqliteExample { public class ArtificialNewType2Delete { public static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("コマンドライン引数エラー"); Console.WriteLine("Usage: adelete2.exe [id]"); return; } // 接続情報取得 ConnectionStringSettings css = ConfigurationManager.ConnectionStrings["SqliteExample"]; string dpstr = css.ProviderName; string constr = css.ConnectionString; string sstr = "SELECT ProductID, ProductName, " + "Price, ProductDescription " + "FROM Products"; // DELETE用SQL文字列 string dstr = "DELETE FROM Products " + "WHERE (ProductID = @P1) AND " + "(ProductName = @P2) AND " + "(Price IS NULL OR Price = @P3) AND " + "(ProductDescription IS NULL OR " + "ProductDescription = @P4)"; 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()) // DELETE用コマンドオブジェクト作成 using (DbCommand dcmd = 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.データセットへのデータ操作 DataRow frow = dt.Rows.Find(args[0]); if (frow != null) { frow.Delete(); } else { Console.WriteLine("削除対象が存在しません"); return; } // DELETE用コマンドオブジェクト設定 dcmd.CommandText = dstr; // パラメータ設定 // @P1 DbParameter p1 = dcmd.CreateParameter(); p1.ParameterName = "@P1"; p1.SourceColumn = "ProductID"; dcmd.Parameters.Add(p1); // @P2 DbParameter p2 = dcmd.CreateParameter(); p2.ParameterName = "@P2"; p2.SourceColumn = "ProductName"; dcmd.Parameters.Add(p2); // @P3 DbParameter p3 = dcmd.CreateParameter(); p3.ParameterName = "@P3"; p3.SourceColumn = "Price"; dcmd.Parameters.Add(p3); // @P4 DbParameter p4 = dcmd.CreateParameter(); p4.ParameterName = "@P4"; p4.SourceColumn = "ProductDescription"; dcmd.Parameters.Add(p4); // トランザクションセット dcmd.Transaction = tran; da.DeleteCommand = dcmd; 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 adelete2.cs -r:System.Configuration.dll -r:System.Data.dll * * 実行: * * mono adelete2.exe [id] * */
構成情報ファイル
構成情報ファイル(adelete2.exe.config)から、接続情報(プロバイダ識別名、DB接続文字列)の取得を試してみました。
以下の構成情報ファイルをadelete2.exeと同じディレクトリに用意する必要があります。
<?xml version="1.0" encoding="utf-8"?> <configuration> <connectionStrings> <add name="SqliteExample" providerName="Mono.Data.Sqlite" connectionString="Data Source=/home/sta/data/TestData.db" /> </connectionStrings> </configuration>
