MySQL操作の最近のブログ記事

<<前回の記事>>

さて、C#でMySQLを操作するは、第7回目となりましたが今回で最後になります。
備忘録パートⅡの終わりなんですw

最終回となる今回は、『トランザクション』について説明していきたいと思います。

それでは、本題に入りましょう。

下表のような2つのテーブルがあるとします。

テーブル名: t_tanka
タイプ: InnnoDB

番号
(i_nbr)
名称
(i_nme)
単価
(i_tnk)
1 コーヒー 150
2 紅茶 130
3 緑茶 120

テーブル名: t_zaiko
タイプ: InnnoDB

番号
(i_nbr)
数量
(i_zik)
1 50
2 30
3 40

そして、以下の新商品が入荷されました。

番号
(i_nbr)
名称
(i_nme)
単価
(i_tnk)
数量
(i_zik)
5 ウーロン茶 120 20

このような場合に、入荷された商品の情報は、『t_tanka』及び『t_zaiko』の両方にデータを登録しなければなりません。『t_tanka』にデータが登録されても、『t_zaiko』への登録が正常に行われなかったら意味がないのです。
このような場合には、トランザクションを用いて処理の単位をひとくくりにしてやると良いでしょう。
まずは、サンプルコーディングをご覧になってみて下さい。

// MySQL コネクション定義
MySqlConnection myConn;

// 接続パラメータ設定
String strConn = "Database=sample;"
  + "Data Source=rhea.gaia.home;"
  + "User ID=sample;"
  + "Password=sample";
try {
  // MySQLへ接続
  myConn = new MySqlConnection(strConn);

  // 接続を開く
  myConn.Open();

  // キャラクタセット設定(シフトJIS)
  MySqlCommand myCom
    = new MySqlCommand("SET NAMES sjis", myConn);
  myCom.ExecuteNonQuery();
} catch (Exception ee) {
  MessageBox.Show(ee.Message, "Error");
  return;
}

// MySQL トランザクション開始
MySqlTransaction myTrans = myConn.BeginTransaction();

// 単価テーブルへの挿入
// SQL 作成
String strSQL1
  = "Insert Into t_tanka(i_nbr, i_nme, i_tnk) Values(5, \"ウーロン茶\", 120) ";
try {
  // MySQL コマンド作成
  MySqlCommand myCommand
    = new MySqlCommand(strSQL1, myConn);

  // データ挿入
  if (myCommand.ExecuteNonQuery() == 1) {
  } else {
    myTrans.Rollback();
    myConn.Close();
    MessageBox.Show("データが正常に挿入されませんでした(1)", "Error");
    return;
  }
} catch (Exception ee) {
  myTrans.Rollback();
  myConn.Close();
  MessageBox.Show(ee.Message, "Error");
  return;
}

// 在庫テーブルへの挿入
// SQL 作成
String strSQL2
  = "Insert Into t_zaiko(i_nbr, i_zik) Values(5, 20) ";
try {
  // MySQL コマンド作成
  MySqlCommand myCommand
    = new MySqlCommand(strSQL2, myConn);

  // データ挿入
  if (myCommand.ExecuteNonQuery() == 1) {
  } else {
    myTrans.Rollback();
    myConn.Close();
    MessageBox.Show("データが正常に挿入されませんでした(2)", "Error");
    return;
  }
} catch (Exception ee) {
  myTrans.Rollback();
  myConn.Close();
  MessageBox.Show(ee.Message, "Error");
  return;
}

// トランザクションコミット
myTrans.Commit();

// コネクションを閉じる
myConn.Close();

それでは、順に見ていきましょう。

1) トランザクションの開始
  MySqlTransaction トランザクション名 = コネクション名.BeginTransaction();

2) t_tanka テーブルへのデータ登録
  ここで処理が失敗した場合には、これまでに行った処理を無かったものとするために巻き戻しをします
  トランザクション名.Rollback();

3) t_zaiko テーブルへのデータ登録
  ここで処理が失敗した場合には、これまでに行った処理を無かったものとするために巻き戻しをします
  トランザクション名.Rollback();

4) 上記2) と3) の処理が正常に行われたなら、行われた処理を結果を確定いたします
  トランザクション名.Commit();

どうでしょうか、これまでにやってまいりました、データ挿入と大きな違いはありませんよね。簡単に言いますと、データ挿入処理を、トランザクションの開始と確定で挟めばいいだけなのです。

※ 表示の都合上、"¥"記号が"\"記号で表示されておりますが実際には半角の"¥"記号になります。
 

<<前回の記事>>
 

今回の『C#でMySQLを操作する』は、データの削除について説明していきたいと思います。
では、早速説明に入っていきましょう。

例として、単価テーブル(t_tanka)のデータを削除してみます。

テーブル名: t_tanka
タイプ: InnnoDB

番号
(i_nbr)
名称
(i_nme)
単価
(i_tnk)
1 コーヒー 150
2 紅茶 130
3 緑茶 120
4 ミネラルウォーター 100

削除データ

番号 名称 単価
4 110

↓↓コーディング例

// MySQL コネクション定義
MySqlConnection myConn;

// 接続パラメータ設定
String strConn = "Database=sample;"
  + "Data Source=rhea.gaia.home;"
  + "User ID=sample;"
  + "Password=sample";
try {
  // MySQLへ接続
  myConn = new MySqlConnection(strConn);

  // 接続を開く
  myConn.Open();

  // キャラクタセット設定(シフトJIS)
  MySqlCommand myCom
    = new MySqlCommand("SET NAMES sjis", myConn);
  myCom.ExecuteNonQuery();
} catch (Exception ee) {
  myConn.Close();
  MessageBox.Show(ee.Message);
  return;
}

// SQL 作成
String strSQL1 = "Delete From t_tanka Where i_nbr = 4 ";
try {
  // MySQL コマンド作成
  MySqlCommand myCommand
    = new MySqlCommand(strSQL1, myConn);

  // データ削除
  if (myCommand.ExecuteNonQuery() == 1) {
  } else {
    MessageBox.Show("データが正常に削除されませんでした");
  }
} catch (Exception ee) {
  myConn.Close();
  MessageBox.Show(ee.Message);
  return;
}

// コネクションを閉じる
myConn.Close();

 では、削除に関しての部分を観ていきましょう。

1) データを削除するためのSQL作成
String SQLテキスト = "Delete From t_tanka Where i_nbr = 4 ";

2) データを更新するためのコマンド作成
MySqlCommand コマンド名
  = new MySqlCommand(SQLテキスト, コネクション名);

3) データ削除
コマンド名.ExecuteNonQuery();
このメソッドは、処理したデータ件数を返しますので、正常に挿入されたか確認するには、返ってきた値をチェックして下さい。

前回までに説明いたしました、データ挿入及び更新と比べてプログラムのコーディングそのものに大きな違いがないことが分かると思います。

※ 表示の都合上『¥』記号が『\』になっておりますが実際には半角の¥記号になります。
 

<<続く>>

 

<<前回の記事>>
 

『C#でMySQLを操作する』も、もう5回目となりました。今回は、データの更新について説明していきたいと思います。
では、早速説明に入っていきましょう。

例として、単価テーブル(t_tanka)のデータを更新してみます。

テーブル名: t_tanka
タイプ: InnnoDB

番号
(i_nbr)
名称
(i_nme)
単価
(i_tnk)
1 コーヒー 150
2 紅茶 130
3 緑茶 120
4 ミネラルウォーター 100

更新内容

番号 名称 単価
4 110

↓↓コーディング例

// MySQL コネクション定義
MySqlConnection myConn;

// 接続パラメータ設定
String strConn = "Database=sample;"
  + "Data Source=rhea.gaia.home;"
  + "User ID=sample;"
  + "Password=sample";
try {
  // MySQLへ接続
  myConn = new MySqlConnection(strConn);

  // 接続を開く
  myConn.Open();

  // キャラクタセット設定(シフトJIS)
  MySqlCommand myCom
    = new MySqlCommand("SET NAMES sjis", myConn);
  myCom.ExecuteNonQuery();
} catch (Exception ee) {
  myConn.Close();
  MessageBox.Show(ee.Message);
  return;
}

// SQL 作成
String strSQL1 = "Update t_tanka "
  + "Set i_nme = \"水\" "
  + "  , i_tnk = 110 "
  + "Where i_nbr = 4 ";
try {
  // MySQL コマンド作成
  MySqlCommand myCommand
    = new MySqlCommand(strSQL1, myConn);

  // データ更新
  if (myCommand.ExecuteNonQuery() == 1) {
  } else {
    MessageBox.Show("データが正常に更新されませんでした");
  }
} catch (Exception ee) {
  myConn.Close();
  MessageBox.Show(ee.Message);
  return;
}

// コネクションを閉じる
myConn.Close();

 では、更新に関しての部分を観ていきましょう。

1) データを更新するためのSQL作成
String SQLテキスト = "Update t_tanka "
  + "Set i_nme = \"水\" "
  + "  , i_tnk = 110 "
  + "Where i_nbr = 4 ";

2) データを更新するためのコマンド作成
MySqlCommand コマンド名
  = new MySqlCommand(SQLテキスト, コネクション名);

3) データ更新
コマンド名.ExecuteNonQuery();
このメソッドは、処理したデータ件数を返しますので、正常に挿入されたか確認するには、返ってきた値をチェックして下さい。

前回のデータ挿入と比べて頂けるとわかると思うのですが、前回との違いは、SQL(クエリー)が違うだけで他は同じなのです。

※ 表示の都合上『¥』記号が『\』になっておりますが実際には半角の¥記号になります。
 

<<続く>>

<<前回の記事>>
 

今回の『C#でMySQLを操作する』では、データの挿入について説明していきたいと思います。
では、早速説明に入っていきましょう。

例として、単価テーブル(t_tanka)にデータを挿入してみます。

テーブル名: t_tanka
タイプ: InnnoDB

番号
(i_nbr)
名称
(i_nme)
単価
(i_tnk)
1 コーヒー 150
2 紅茶 130
3 緑茶 120

挿入するデータ

番号 名称 単価
4 ミネラルウォーター 100

↓↓コーディング例

// MySQL コネクション定義
MySqlConnection myConn;

// 接続パラメータ設定
String strConn = "Database=sample;"
  + "Data Source=rhea.gaia.home;"
  + "User ID=sample;"
  + "Password=sample";
try {
  // MySQLへ接続
  myConn = new MySqlConnection(strConn);

  // 接続を開く
  myConn.Open();

  // キャラクタセット設定(シフトJIS)
  MySqlCommand myCom
    = new MySqlCommand("SET NAMES sjis", myConn);
  myCom.ExecuteNonQuery();
} catch (Exception ee) {
  myConn.Close();
  MessageBox.Show(ee.Message);
  return;
}

// SQL 作成
String strSQL1
  = "Insert Into t_tanka(i_nbr, i_nme, i_tnk) Values(4, \"ミネラルウォーター\", 100) ";
try {
  // MySQL コマンド作成
  MySqlCommand myCommand
    = new MySqlCommand(strSQL1, myConn);

  // データ挿入
  if (myCommand.ExecuteNonQuery() == 1) {
  } else {
    MessageBox.Show("データが正常に挿入されませんでした");
  }
} catch (Exception ee) {
  myConn.Close();
  MessageBox.Show(ee.Message);
  return;
}

// コネクションを閉じる
myConn.Close();

 前回までに、説明いたしました接続方法などについての説明は省いて、挿入に関しての部分を観ていきましょう。

1) データを挿入するためのSQL作成
String SQLテキスト
  = "Insert Into t_tanka(i_nbr, i_nme, i_tnk) Values(4, \"ミネラルウォーター\", 100) ";

2) データを挿入するためのコマンド作成
MySqlCommand コマンド名
  = new MySqlCommand(SQLテキスト, コネクション名);

3) データ挿入
コマンド名.ExecuteNonQuery();
このメソッドは、処理したデータ件数を返しますので、正常に挿入されたか確認するには、返ってきた値をチェックして下さい。

※ 表示の都合上『¥』記号が『\』になっておりますが実際には半角の¥記号になります。
 

<<続く>>

<<前回の記事>>
 

今回で、第3回目となりました。いよいよ今回から本題となる内容に入っていきます。今回は『データの読込み』について説明していきたいと思います。

今後の説明で使用いたしますサンプル・テーブルは、『InnnoDB』タイプのテーブルを使用していきます。

テーブル名: t_tanka

番号
(i_nbr)
名称
(i_nme)
単価
(i_tnk)
1 コーヒー 150
2 紅茶 130
3 緑茶 120

↓↓コーディング例

// MySQL コネクション定義
MySqlConnection myConn;

// MySQL コマンド定義
MySqlCommand myCommand;

// MySQL データリーダー定義
MySqlDataReader myReader;

// 接続パラメータ設定
String strConn = "Database=sample;"
  + "Data Source=rhea.gaia.home;"
  + "User ID=sample;"
  + "Password=sample";
try {
    // MySQLへ接続
    myConn = new MySqlConnection(strConn);

    // 接続を開く
    myConn.Open();

    // キャラクタセット設定(シフトJIS)
    MySqlCommand myCom
      = new MySqlCommand("SET NAMES sjis", myConn);
    myCom.ExecuteNonQuery();
} catch (Exception ee) {
    MessageBox.Show(ee.Message, "Error");
    return;
}

// SQL 作成
String strSQL = "Select i_nbr, i_nme, i_tnk From t_tanka ";
try {
  // MySQL コマンド作成
  myCommand = new MySqlCommand(strSQL, myConn);

  // MySQL データリーダー作成
  myReader = myCommand.ExecuteReader();
} catch (Exception ee) {
  myConn.Close();
  MessageBox.Show(ee.Message, "Error");
  return;
}

// データを読込み処理を繰り返す
while (myReader.Read() == true) {
  Int32 i_nbr = 0;
  String i_nme = "";
  Decimal i_tnk = 0;

  // 一連番号取得
  if (myReader.IsDBNull(0) == true) {
    i_nbr = 0;
  } else {
    i_nbr = myReader.GetInt32("i_nbr");
  }

  // 名称取得
  if (myReader.IsDBNull(1) == true) {
    i_nme = "";
  } else {
    i_nme = myReader.GetString("i_nme");
  }

  // 単価取得
  if (myReader.IsDBNull(2) == true) {
    i_tnk = 0;
  } else {
    i_tnk = myReader.GetDecimal("i_tnk");
  }
}

// 接続を閉じる
myConn.Close();

順に見ていきましょう。

1) 読込を行うためのコマンド定義
  MySqlCommand コマンド名;

2) 読込に使用するデータリーダー定義
  MySqlDataReader データリーダー名;

3) 読込に使用するSQLの作成
  String SQLテキスト = "Select i_nbr, i_nme, i_tnk From t_tanka ";

4) SQLコマンド作成
  コマンド名 = new MySqlCommand(SQLテキスト, コネクション名);

5) データリーダー作成
  データリーダー名 = コマンド名.ExecuteReader();

6) データの読込み
  データリーダー名.Read()
  このメソッドは、データが無い場合には『False(偽)』を返します。

7) フィールドの中が空かどうかの確認
  データリーダー名.IsDBNull(0)
  括弧ないの0は、SQLテキスト内のフィールドの順番をしまします(先頭は0)。
  そして、このメソッドは、データが空だと『True(真)』を返します。

8) 値の取り出し
  データリーダー名.GetInt32("i_nbr");  ←  Int32型の項目
  データリーダー名.GetString("i_nme");  ←  String型の項目
  データリーダー名.GetDecimal("i_tnk");  ←  Decimal型の項目
  括弧内は、テーブルのフィールド名か、フィールドの順番を記述します。

注意しなければならないのは、データの値を取り出す前に、そのフィールドの値が空かどうかを確認する必要があります。ただし、対象となるフィールドが『Not Null』属性を持っている場合には、確認する必要はありません。

実際に、プログラムを作る際には、こういった確認を各フィールド毎に行うのも効率が悪いので、値を確認してその結果によって0や空文字列(空文字列は長さ0の文字列)を返すような関数ないしクラスライブラリを作成する方がよいでしょう。
 

<<続く>>

<<前回の記事>>
 

 前回は、接続についての説明をたしましたので、今回は接続したコネクションを閉じる方法について説明したいと思います。

以前に説明した Access形式の DB でも、最後には接続を閉じる必要があると言いましたが、それは MySQL でも同じです。接続したら、最後には閉じることを行って下さい。

では、コーディング例を、ご覧になってみて下さい。

↓↓は、コーディングサンプルです。

// MySQL コネクション定義
MySqlConnection myConn;

// 接続パラメータ設定
String strConn = "Database=sample;"
  + "Data Source=rhea.gaia.home;"
  + "User ID=sample;"
  + "Password=sample";
try {
    // MySQLへ接続
    myConn = new MySqlConnection(strConn);

    // 接続を開く
    myConn.Open();

    // キャラクタセット設定(シフトJIS)
    MySqlCommand myCom
      = new MySqlCommand("SET NAMES sjis", myConn);
    myCom.ExecuteNonQuery();
} catch (Exception ee) {
    MessageBox.Show(ee.Message, "Error");
    return;
}

// 接続を閉じる
myConn.Close();

『またかw』と、思われた方もいらっしゃるかもしれませんが、コネクションを閉じるには、たった1行のコーディングでいいんです。Access形式の DB でも同じでしたね。

1) 接続を閉じる
  コネクション名.Close();

使うデータベースこそ違いますけどコーディングは、よく似ていますよね。
 

<<続く>>

C#でDB を操作する』では、Access 形式の MDB ファイルの操作について説明いたしましたが、今回からはフリーDB として幅広く使用されております『MySQL』の操作について説明していきたいと思います。
備忘録 PartⅡの噂もありますがw

前提として、MySQL への接続には『MySQL Connector/ODBC』で行うのではなく、『MySQL Connector/Net 5.1』を使用してMySQLの操作を行います。

さて、第一回目となる、今回は『接続』に関してのの説明を行いたいと思います。
が、まずは【ソリューションエクスプローラ】の【参照設定】の中に『MySql.Data』を追加して下さい。

では、早速サンプルから見ていきましょう。

↓↓は MySQL Connector を使用する上で必要になります

using MySql.Data.MySqlClient;
using MySql.Data.Types;

↓↓コーディングサンプル

// MySQL コネクション定義
MySqlConnection myConn;

// 接続パラメータ設定
String strConn = "Database=sample;"
  + "Data Source=rhea.gaia.home;"
  + "User ID=sample;"
  + "Password=sample";
try {
    // MySQLへ接続
    myConn = new MySqlConnection(strConn);

    // 接続を開く
    myConn.Open();

    // キャラクタセット設定(シフトJIS)
    MySqlCommand myCom
      = new MySqlCommand("SET NAMES sjis", myConn);
    myCom.ExecuteNonQuery();
} catch (Exception ee) {
    MessageBox.Show(ee.Message, "Error");
    return;
}

1) MySQLコネクション定義
 MySQLへの接続を行うために必要となるコネクションの定義です。
 MySqlConnection コネクション名;

2) 接続パラメータ設定
 Database ← MySQL のデータベース名
 Data Source ← 接続するホスト名(IPアドレス指定も可能)
 User ID ← ユーザーID
 Password ← パスワード

3) MySQL へ接続
 コネクション名 = new MySqlConnection("接続パラメータ");

4) 接続したコネクションを開く
 コネクション名.Open();

5) キャラクタセットの設定(例として『シフトJIS』を設定してます)
 MySqlCommand コマンド名
   = new MySqlCommand("SET NAMES sjis", コネクション名);
 コマンド名.ExecuteNonQuery();

以上のような流れで MySQL への接続が可能になります。
ただし、あくまでも接続しただけにすぎませんので、表面上はなんの変化も起こりません。

※ 5) のキャラクタセットの設定は、行わなくても問題のない場合もありますが、やっておいた方が無難だと思います。
 

<<続く>>

2009年12月

    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    

リンク

相互リンク

あわせて読みたいブログパーツ