SHOEISHA iD

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

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

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

MonoでSQLiteを使ってみたよ!(DBアクセス-コマンド編)

MonoでSQLiteを使う(前篇)

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

INSERT

 INSERT文の実行によるデータの挿入を行うサンプルコードです。

insert2.cs
using System;
using System.Data;
using System.Data.Common;

namespace SqliteExample
{
  public class NewType2Insert
  {
    public static void Main(string[] args)
    {
      if (args.Length != 2)
      {
        Console.WriteLine("コマンドライン引数エラー");
        Console.WriteLine("Usage: insert2.exe [id] [name]");
        return;
      }

      string dpstr  = "Mono.Data.Sqlite";
      string constr = "Data Source=/home/sta/data/TestData.db";

      // パターン1
      //string sqlstr = "INSERT INTO Products (ProductID, " +
      //                  "ProductName, Price, " +
      //                  "ProductDescription) " +
      //                "VALUES (2, 'Hammer', 10, 'トンカチ')";
      // パターン2
      //string sqlstr = "INSERT INTO Products " +
      //                "VALUES(3, 'Wrench', 10, 'レンチ')";
      // パターン3
      //string sqlstr = "INSERT INTO Products " +
      //                  "(ProductID, ProductName) " +
      //                "VALUES ('{0}', '{1}')";
      //sqlstr = String.Format(sqlstr, args[0], args[1]);
      // パターン4
      //string sqlstr = "INSERT INTO Products " +
      //                  "(ProductID, ProductName) " +
      //                "VALUES (?, ?)";
      // パターン5
      string sqlstr = "INSERT INTO Products " +
                          "(ProductID, ProductName) " +
                        "VALUES (@P1, @P2)";

      DbProviderFactory dpf = DbProviderFactories.GetFactory(dpstr);
      // 1.DBコネクションオブジェクト作成
      using (DbConnection dbcon = dpf.CreateConnection())
      {
        dbcon.ConnectionString = constr;
        // 2.DBコネクションオープン
        dbcon.Open();

        try
        {
          // トランザクション開始
          using (DbTransaction tran = dbcon.BeginTransaction())
          // 3.DBコマンドオブジェクト作成
          using (DbCommand dbcmd = dbcon.CreateCommand())
          {
            dbcmd.CommandText = sqlstr;

            // パラメータ設定
            // パターン4
            //DbParameter p1 = dbcmd.CreateParameter();
            //p1.Value = args[0];
            //dbcmd.Parameters.Add(p1);
            //DbParameter p2 = dbcmd.CreateParameter();
            //p2.Value = args[1];
            //dbcmd.Parameters.Add(p2);
            // パターン5
            // @P1
            DbParameter p1 = dbcmd.CreateParameter();
            p1.ParameterName = "@P1";
            p1.Value = args[0];
            dbcmd.Parameters.Add(p1);
            // @P2
            DbParameter p2 = dbcmd.CreateParameter();
            p2.ParameterName = "@P2";
            p2.Value = args[1];
            dbcmd.Parameters.Add(p2);

            // トランザクション設定
            dbcmd.Transaction = tran;

            try
            {
              // 4.DBコマンド実行
              dbcmd.ExecuteNonQuery();
              // コミット
              tran.Commit();
            }
            catch(Exception ex)
            {
              // ロールバック
              tran.Rollback();
              Console.WriteLine("更新エラー: {0}", ex.Message);
            }
          }
        }
        finally
        {
          if (dbcon != null)
          {
            // 5.DBコネクションクローズ
            dbcon.Close();
          }
        }
      }
    }
  }
}
/*
 * ビルド:
 *
 *   gmcs insert2.cs -r:System.Data.dll
 *
 * 実行:
 *
 *   mono insert2.exe [id] [name]
 *
 */

SQL文字列

 SQL文字列にいくつかパターンを設定して動作確認を行いました。パラメータを使用したパターン4(位置指定)、パターン5(名前付き)を試しましたが、両方とも問題はありませんでした。

トランザクション

 データ更新を伴うことから、トランザクション処理を付加しています。

SQLiteのトランザクションについて
 SQLiteでは上記コードのトランザクション処理を行うと、コミットを実行するまでデータベース全体にロックがかかり、SELECT以外のSQL(INSERT、UPDATE、DELETE等)実行はエラーとなります(同データベース内の他テーブルへのアクセスについても同様です)。
 

ExecuteNonQuery

 INSERT文の実行にコマンドオブジェクトのExecuteNonQueryメソッドを使用しています。INSERT文の様に問合せ結果を必要としない場合に使用します(実際にはint型の戻り値(処理件数)がありますが、今回は使用していません)。SELECT文の実行には問合せ結果を必要とするのでExecuteReaderメソッドを使用しています。

UPDATE

 UPDATE文の実行によるデータの更新を行うサンプルコードです。

update2.cs
using System;
using System.Data;
using System.Data.Common;

namespace SqliteExample
{
  public class NewType2Update
  {
    public static void Main(string[] args)
    {
      if (args.Length != 3)
      {
        Console.WriteLine("コマンドライン引数エラー");
        Console.WriteLine(
                    "Usage: update2.exe [id] [price] [description]");
        return;
      }

      string dpstr  = "Mono.Data.Sqlite";
      string constr = "Data Source=/home/sta/data/TestData.db";

      // パターン1
      //string sqlstr = "UPDATE Products SET Price = 11 " +
      //                "WHERE ProductID = 2";
      // パターン2
      //string sqlstr = "UPDATE Products SET Price = 11, " +
      //                  "ProductDescription = 'Wrench' " +
      //                "WHERE ProductID = 3";
      // パターン3
      //string sqlstr = "UPDATE Products SET Price = {0}, " +
      //                  "ProductDescription = '{1}' " +
      //                "WHERE ProductID = {2}";
      //sqlstr = String.Format(sqlstr, args[1], args[2], args[0]);
      // パターン4
      //string sqlstr = "UPDATE Products SET Price = ?, " +
      //                  "ProductDescription = ? " +
      //                "WHERE ProductID = ?";
      // パターン5
      string sqlstr = "UPDATE Products SET Price = @P1, " +
                        "ProductDescription = @P2 " +
                      "WHERE ProductID = @P3";

      DbProviderFactory dpf = DbProviderFactories.GetFactory(dpstr);
      // 1.DBコネクションオブジェクト作成
      using (DbConnection dbcon = dpf.CreateConnection())
      {
        dbcon.ConnectionString = constr;
        // 2.DBコネクションオープン
        dbcon.Open();

        try
        {
          // トランザクション開始
          using (DbTransaction tran = dbcon.BeginTransaction())
          // 3.DBコマンドオブジェクト作成
          using (DbCommand dbcmd = dbcon.CreateCommand())
          {
            dbcmd.CommandText = sqlstr;

            // パラメータ設定
            // パターン4
            //DbParameter p1 = dbcmd.CreateParameter();
            //p1.Value = args[1];
            //dbcmd.Parameters.Add(p1);
            //DbParameter p2 = dbcmd.CreateParameter();
            //p2.Value = args[2];
            //dbcmd.Parameters.Add(p2);
            //DbParameter p3 = dbcmd.CreateParameter();
            //p3.Value = args[0];
            //dbcmd.Parameters.Add(p3);
            // パターン5
            // @P1
            DbParameter p1 = dbcmd.CreateParameter();
            p1.ParameterName = "@P1";
            p1.Value = args[1];
            dbcmd.Parameters.Add(p1);
            // @P2
            DbParameter p2 = dbcmd.CreateParameter();
            p2.ParameterName = "@P2";
            p2.Value = args[2];
            dbcmd.Parameters.Add(p2);
            // @P3
            DbParameter p3 = dbcmd.CreateParameter();
            p3.ParameterName = "@P3";
            p3.Value = args[0];
            dbcmd.Parameters.Add(p3);

            // トランザクション設定
            dbcmd.Transaction = tran;

            try
            {
              // 4.DBコマンド実行
              dbcmd.ExecuteNonQuery();
              // コミット
              tran.Commit();
            }
            catch(Exception ex)
            {
              // ロールバック
              tran.Rollback();
              Console.WriteLine("更新エラー: {0}", ex.Message);
            }
          }
        }
        finally
        {
          if (dbcon != null)
          {
            // 5.DBコネクションクローズ
            dbcon.Close();
          }
        }
      }
    }
  }
}

/*
 * ビルド:
 *
 *   gmcs update2.cs -r:System.Data.dll
 *
 * 実行:
 *
 *   mono update2.exe [id] [price] [description]
 *
 */

DELETE

 DELETE文の実行によるデータの削除を行うサンプルコードです。

delete2.cs
using System;
using System.Data;
using System.Data.Common;

namespace SqliteExample
{
  public class NewType2Delete
  {
    public static void Main(string[] args)
    {
      if (args.Length != 1)
      {
        Console.WriteLine("コマンドライン引数エラー");
        Console.WriteLine("Usage: delete2.exe [id]");
        return;
      }

      string dpstr  = "Mono.Data.Sqlite";
      string constr = "Data Source=/home/sta/data/TestData.db";

      // パターン1
      //string sqlstr = "DELETE FROM Products WHERE ProductID = ?";
      // パターン2
      string sqlstr = "DELETE FROM Products WHERE ProductID = @P1";

      DbProviderFactory dpf = DbProviderFactories.GetFactory(dpstr);
      // 1.DBコネクションオブジェクト作成
      using (DbConnection dbcon = dpf.CreateConnection())
      {
        dbcon.ConnectionString = constr;
        // 2.DBコネクションオープン
        dbcon.Open();

        try
        {
          // トランザクション開始
          using (DbTransaction tran = dbcon.BeginTransaction())
          // 3.DBコマンドオブジェクト作成
          using (DbCommand dbcmd = dbcon.CreateCommand())
          {
            dbcmd.CommandText = sqlstr;

            // パラメータ設定
            DbParameter p1 = dbcmd.CreateParameter();
            // パターン2
            // @P1
            p1.ParameterName = "@P1";

            p1.Value = args[0];
            dbcmd.Parameters.Add(p1);

            // トランザクション設定
            dbcmd.Transaction = tran;

            try
            {
              // 4.DBコマンド実行
              dbcmd.ExecuteNonQuery();
              // コミット
              tran.Commit();
            }
            catch(Exception ex)
            {
              // ロールバック
              tran.Rollback();
              Console.WriteLine("更新エラー: {0}", ex.Message);
            }
          }
        }
        finally
        {
          if (dbcon != null)
          {
            // 5.DBコネクションクローズ
            dbcon.Close();
          }
        }
      }
    }
  }
}
/*
 * ビルド:
 *
 *   gmcs delete2.cs -r:System.Data.dll
 *
 * 実行:
 *
 *   mono delete2.exe [id]
 *
 */

次の記事では

 次の記事では今回の設定をもとに、データアダプタを使ったDBアクセスについて解説します。

参考資料

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

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

もっと読む

この記事の著者

sta(エステーエー)

風来坊blog:sta.blockhead

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング