2−5 MySQLテーブルの追加・更新をする

 前回、MySQLのデータベースの更新処理を行ってみた。データ更新のイメージしかし、この方法は テーブルの何件目かを指定し、その値を更新するという処理でした。考えてみれば、こういった場面というのは それほど多いわけではありません。実用レベルとして使用したいのであれば、特定のキーを持つデータの値を更新したり 新しいデータを追加したりすることが求められるでしょう。いかにしてその要求を実現すればよいのでしょうか?
 方法として、今回はMySQLのテーブルからDataAdapterを作成し、このレコードセットに対して更新をかけて その内容を再びMySQLのテーブルにもどしてやるようなイメージをもとに処理を作成してみます。

1.店番号を指定して 対象のデータを抽出
 MySQLのテーブル内の指定データを更新する為には、店コード(主キー)の値を指定して データの抽出が出来る仕組みが是非とも必要ですが、これを実現する方法としてパラメータを利用することにします。
 考え方としては、Accessで使われるパラメータクエリーのようなもので 事前に抽出用のSelect文の中に パラメータを組み込んでおき(Parameter)、このパラメータに値を取り込んでDataAdapterを作成。DataAdapterを元に 内容を画面に表示しようとするものです。コードは以下のようになります。なお、画面のボタンを変更し、Button4のTextをとし、このボタンクリック時のイベントにコードを記載しています。

Private Sub Button4_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button4.Click
Dim sqlDA As MySql.Data.MySqlClient.MySqlDataAdapter 'データアダプタ作成指定データ抽出画面
Dim I As Integer 'カウンター
Dim resultDS As DataSet 'データセットオブジェクト
Dim MyconString As String 'MySQL接続文字列
'DataAdapterオブジェクトの作成
sqlDA = New MySql.Data.MySqlClient.MySqlDataAdapter
'DataSetオブジェクトの作成
resultDS = New DataSet()
'MySQL接続文字列
MyconString = "server=localhost;user id=hanbai;password=password;database=tanpin;"
'接続を作成します
sqlDA.SelectCommand = New MySqlCommand()
sqlDA.SelectCommand.CommandType = CommandType.Text
 sqlDA.SelectCommand.CommandText = "select tencode, tenname from tentbl where tencode = ?tencode"
Dim MyParm = sqlDA.SelectCommand.Parameters.AddWithValue("?tencode", MySqlDbType.Int16)
sqlDA.SelectCommand.Connection = New MySqlConnection(MyconString)
'
ListBox1.Items.Clear()
'
Try
'パラメータ値を指定して
MyParm.Value = TextBox1.Text
'検索結果を確認する。
sqlDA.Fill(resultDS, "tentbl")
'Dataset内のテーブル"tentbl"の各レコードに対して処理を実行
For I = 0 To resultDS.Tables("tentbl").Rows.Count - 1
ListBox1.Items.Add(resultDS.Tables("tentbl").Rows(I).Item("tencode").ToString() & " " & _
resultDS.Tables("tentbl").Rows(I).Item("tenname").ToString() & " " & _
Len(resultDS.Tables("tentbl").Rows(I).Item("tenname").ToString()))
Next
Catch ex As Exception
MessageBox.Show(e.ToString)
Finally
End Try
MessageBox.Show(Str(I) & "件処理しました")
End Sub
 

 where tencode = ?tencode のような形で検索用のデータを受け取るパラメータをSQL文に入れておき、Parameters.AddWithValue("?tencode", MySqlDbType.Int16) という形でパラメータの使用を登録します。なお、ものの本にはParameters.Add となっていますが、これは古い使い方ですので 上のようにしました。
 最終的にはMyParm.Value = TextBox1.Text のようにして検索用の値を設定してからDataAdapterを作成します。

2.画面イメージの変更
 今回は、前回と同じ店名テーブルを使用しますが、画面の右側にボタンがたくさん並んでしまっています。メニューイメージ見栄えが悪いので 処理をメニューから起動するようにしました。
 データ表示−DataReaderによるテーブルの内容取得
 指定行更新−Connecter-Netによる更新(指定の行更新)
 指定抽出−店番号を指定して 対象のデータを抽出(上の処理)
 店名更新−店番号・店名を指定して データを更新
の4つのパターンをメニューに移しています。

3.指定の店番号で データを更新
 上の例でパラメータの使い方の基本は理解できたとおもいます。
 さて、今度は本題である指定店番号の店名を変更する処理ですが、より簡単なのは、1の例で作成したような方法で指定の店コードを持つDataAdapterを作成し このデータセットに対して更新を行う。次に、更新用のUPDATEコマンドを自動で作成。MySQLのテーブルを更新するという方法です。(上の概念図の方法)
 ですが、今回は直接更新用のコマンドを作成して更新をかける方法を取るようにします。以下のようなコードになります。

Private Sub 店名更新ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 店名更新UToolStripMenuItem.Click
Dim sqlCmd As New MySqlCommand 'SQLコマンド
Dim MyconString As String 'MySQL接続文字列
'MySQL接続文字列コマンドによるデータ更新
MyconString = "server=localhost;user id=hanbai;password=password;database=tanpin;"
'
Try
'接続します
Dim sqlCont As New MySqlConnection(MyconString) 'SQL接続
sqlCont.Open()
Try
'始めにパラメータを設定します。
sqlCmd.Connection = sqlCont
sqlCmd.CommandText = "UPDATE tentbl SET tenname = ?tenname " & _
"WHERE tencode = ?tencode"
sqlCmd.Parameters.Add(New MySqlParameter("?tencode", MySqlDbType.Int16))
sqlCmd.Parameters.Add(New MySqlParameter("?tenname", MySqlDbType.VarString))
'次に、設定したパラメータに対し 値を登録します。
sqlCmd.Parameters("?tencode").Value = TextBox1.Text
sqlCmd.Parameters("?tenname").Value = TextBox2.Text
'内容を更新します。
sqlCmd.ExecuteNonQuery()
Finally
sqlCont.Close()
End Try
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Finally
End Try
'
MessageBox.Show("更新を行いました。店番号 = " & TextBox1.Text & " 店名 = " & TextBox2.Text)
End Sub

この内容について説明すると、MySQLにまず接続し、"UPDATE tentbl SET tenname = ?tenname WHERE tencode = ?tencode"という形で上書き用のコマンドを作成。次に、Parameters.Add(New MySqlParameter("?tencode", MySqlDbType.Int16))という形でパラメータを(この場合2つ)作成。パラメータに値を設定してから ExecuteNonQuery()を利用して MySQLのテーブルを直接更新します。メニューから「データ表示」を行って、正しくMySQLが更新されているのを確認します。

4.データの追加はどうしたら?
 これで、データの更新ができるのはわかりましたが、同じように追加もできるのでしょうか?試しに店番号を24番(登録されていない店番号)とし、店名を江戸川橋として「店名更新」を行ってみます。結果、最後のメッセージボックスが処理されて、指定の店番号で店名が あたかも登録されたかのように見えます。しかし、「データ表示」を行ってみると、登録した筈の24番店が実際には処理されいていないのがわかります。つまり、更新用のコマンドではデータの追加は行えないのです。ここで、内容を変更して 追加用のコマンドを作成してみました。(実際には、追加用のコマンドは別なサブルーチンとして登録しておきます。−5を参照の事)

Private Sub 店名更新ToolStripMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles 店名更新UToolStripMenuItem.Click
Dim sqlCmd As New MySqlCommand 'SQLコマンド
Dim MyconString As String 'MySQL接続文字列
'MySQL接続文字列
MyconString = "server=localhost;user id=hanbai;password=password;database=tanpin;"

Try
'接続します
Dim sqlCont As New MySqlConnection(MyconString) 'SQL接続
sqlCont.Open()
Try
'始めにパラメータを設定します。
sqlCmd.Connection = sqlCont
sqlCmd.CommandText = "INSERT INTO tentbl ( tencode, tenname) VALUES ( ?tencode, ?tenname)"
sqlCmd.Parameters.Add(New MySqlParameter("?tencode", MySqlDbType.Int16))
sqlCmd.Parameters.Add(New MySqlParameter("?tenname", MySqlDbType.VarString))
'次に、設定したパラメータに対し 値を登録します。
sqlCmd.Parameters("?tencode").Value = TextBox1.Text
sqlCmd.Parameters("?tenname").Value = TextBox2.Text
'内容を更新します。
sqlCmd.ExecuteNonQuery()
Finally
sqlCont.Close()
End Try
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Finally
End Try
End Sub

 見てもらうとわかるように、SQL文が"INSERT INTO tentbl ( tencode, tenname) VALUES ( ?tencode, ?tenname)"に置き換わっているだけです。先程と同じように、店番号を24番とし、店名を江戸川橋として「店名更新」を行ってみます。「データ表示」を行ってみると 今度は正しく追加されていました。
 でも、追加なのか、更新なのかは 実際の処理の段階では わからない事が多いのではないでしょうか?明らかに追加なのか更新なのかがわかるならば、メニューを二つ作っておく事で対応が可能なのですが・・・。


「市民の目」トップページへ戻る