2014年1月2日木曜日

【VB.NET】ADO.NET DataAdapterの更新用Commandでデータの更新をする。


前述の「CommandBuilderを利用して取得したデータを更新する。」では単一テーブル以外は
SqlCommandを自動生成してくれません。
なのでテーブル結合や副問い合わせでデータを取得した場合はDataAdapterのInsertCommand,
UpdateCommandおよびDeleteCommandを設定しておきデータの変更後にデータベースを更新します。
  1. DataAdapterのSelectCommanを設定する。
  2. 更新用SqlCommandにインスタンスを設定する。
  3. 更新用SqlCommandのConnectionを設定する。
  4. 更新用SqlCommandのCommandTextにSQL文を設定する。
  5. DataAdapter.Fillメソッドを実行しデータを取得する。
  6. データを変更する。
  7. DataAdaspter.Updateメソッドを実行しデータベースを更新する。
使用例:商品マスタと売上データを連結して取得しデータを更新します。

商品マスタのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名商品マスタ物理テーブル名M_ITEM
列定義
No論理名物理名データ型Nullを許容主キー
1商品CDITEM_CDnvarchar(4)NoYes
2商品名ITEM_NMnvarchar(32)No
3単価PRICEnumeric(8,0)No

商品マスタのテーブルデータ


売上データのテーブル定義
インスタンス名SQLEXPRESSデータベース名SAMPLE_DB
論理テーブル名売上データ物理テーブル名T_SALES
列定義
No論理名物理名データ型Nullを許容主キー
1NONOnumeric(8,0)NoYes
2商品CDITEM_CDnvarchar(4)No
3売上数UNIT_SALESnumeric(8,0)No
4売上額SALES_AMOUNTnumeric(8,0)No

売上データ














※パラメータ設定のSqlDbTypeについてはSQLServerデータ型のマッピングを参照してください。
Imports System.Data.SqlClient
 
Module Module1
 
    Sub Main()
        Dim con As New SqlConnection
 
        'DB接続
        con.ConnectionString = "Data Source=localhost\SQLEXPRESS;Initial Catalog=SAMPLE_DB;Integrated Security=True"
        con.Open()
 
        
        'SqlDataAdapter
        Dim da As New SqlDataAdapter()
 
        'SelectComman設定
        da.SelectCommand = New SqlCommand
        da.SelectCommand.Connection = con
        da.SelectCommand.CommandText = "SELECT NO, T_SALES.ITEM_CD AS ITEM_CD, ITEM_NM, PRICE, UNIT_SALES, SALES_AMOUNT " _
                               + "FROM M_ITEM INNER JOIN T_SALES ON M_ITEM.ITEM_CD = T_SALES.ITEM_CD"
 
        'InsertCommand設定
        da.InsertCommand = New SqlCommand
        da.InsertCommand.Connection = con
        da.InsertCommand.CommandText = "INSERT INTO T_SALES(ITEM_CD, UNIT_SALES, SALES_AMOUNT) VALUES (@ITEM_CD, @UNIT_SALES, @SALES_AMOUNT)"
        'パラメータ設定
        da.InsertCommand.Parameters.Add("@ITEM_CD", SqlDbType.NVarChar, 4, "ITEM_CD")
        da.InsertCommand.Parameters.Add("@UNIT_SALES", SqlDbType.Decimal, 8, "UNIT_SALES")
        da.InsertCommand.Parameters.Add("@SALES_AMOUNT", SqlDbType.Decimal, 8, "SALES_AMOUNT")
 
        'UpdateCommand設定
        da.UpdateCommand = New SqlCommand
        da.UpdateCommand.Connection = con
        da.UpdateCommand.CommandText = "UPDATE T_SALES SET ITEM_CD = @ITEM_CD, UNIT_SALES = @UNIT_SALES, SALES_AMOUNT = @SALES_AMOUNT WHERE NO = @NO"
        'パラメータ設定
        da.UpdateCommand.Parameters.Add("@ITEM_CD", SqlDbType.NVarChar, 4, "ITEM_CD")
        da.UpdateCommand.Parameters.Add("@UNIT_SALES", SqlDbType.Decimal, 8, "UNIT_SALES")
        da.UpdateCommand.Parameters.Add("@SALES_AMOUNT", SqlDbType.Decimal, 8, "SALES_AMOUNT")
        da.UpdateCommand.Parameters.Add("@NO", SqlDbType.Decimal, 8, "NO")
 
        'DeleteCommand設定
        da.DeleteCommand = New SqlCommand
        da.DeleteCommand.Connection = con
        da.DeleteCommand.CommandText = "DELETE FROM T_SALES WHERE NO = @NO"
        'パラメータ設定
        da.DeleteCommand.Parameters.Add("@NO", SqlDbType.Decimal, 8, "NO")
 
        'DataSet
        Dim ds As New DataSet
 
        'データを取得
        da.Fill(ds, "T_SALES")
 
        'テーブルを取得
        Dim dt As DataTable = ds.Tables("T_SALES")
 
        'レコード追加
        Dim nr As DataRow = dt.NewRow
        nr("ITEM_CD") = "002"
        nr("UNIT_SALES") = 500
        nr("SALES_AMOUNT") = 100000
        dt.Rows.Add(nr)
 
        'レコード変更
        dt.Rows(3)("UNIT_SALES") = 200
        dt.Rows(3)("SALES_AMOUNT") = 60000
 
        'レコード削除
        dt.Rows(5).Delete()
 
        'データ更新
        da.Update(ds, "T_SALES")
 
        'SqlDataAdapterの解放
        da.Dispose()
 
        '接続を閉じる
        con.Close()
 
        'SqlConnctionの解放
        con.Dispose()
 
        Console.WriteLine("データを更新しました")
    End Sub
 
End Module
実行結果

0 件のコメント:

コメントを投稿