SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

MonoでDBMS用データプロバイダを使う

MonoでSQLiteを使ってみたよ!(DBアクセス-データアダプタ編)

MonoでSQLiteを使う(後篇)

  • X ポスト
  • このエントリーをはてなブックマークに追加

UPDATE

 データセットへのデータ操作(データの更新)後、DBへのデータ反映(データアダプタのUpdateメソッドによるUPDATE文の実行)を行うサンプルコードです。

aupdate2.cs
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)。

次のページ
DELETE

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
MonoでDBMS用データプロバイダを使う連載記事一覧

もっと読む

この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/2851 2008/08/27 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング