●DataAdapterのUpdateメソッドでデータベースに反映する – SQL自動生成 (ch58DataGrid2.aspx)
DataGridから追加した行(レコード)をOracleデータベースに反映するのに、OracleDataAdapterのUpdateメソッドを使用します。Updateメソッドが使用するSQL文は、OracleCommandBuilderで自動生成します。OracleCommandBuilderは、OracleDataAdapterのSelectCommandに格納されているSELECT文を基に追加、更新、削除のSQL文を生成します。
このサンプルでは、以下のノウハウを習得することができます。
▼DataGridから新規登録した行(レコード)をデータベースに反映するのにDataAdapterのUpdateメソッドを使用する方法
▼CommandBuilderで追加、更新、削除用のSQL文を自動生成する方法
▼DataTableをセッションステートに保存する方法
▼DataGridから追加した行(レコード)をDataTableに反映する方法
1. モジュールレベルの変数追加
ch58DataGrid1.aspxのコードビューを表示したら、Sub Page_Loadイベントの直前に以下の変数を追加します。ここで宣言した変数は、イベントとメソッドから共有します。
Private mcon As OracleConnection
Private mcb As OracleCommandBuilder
Private mda As OracleDataAdapter
Private mdt As DataTable
Private Const mCacheKey = "Ch58DataGrid2DataTable"
2.
Page_Loadイベントの書き換え
Page_Loadイベントを以下のように書き換えます。OracleConnectionとOracleDataAdapterのインスタンスを生成したら、OracleCommandBuilderのインスタンスを生成して追加、更新、削除用のSQL文を生成します。
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)
Handles MyBase.Load
Dim strSQL As String = "SELECT CustomerID, CompanyName, " & _
"ContactName, Phone FROM Customers " & _
"WHERE CustomerID > 40 " & _
"ORDER BY CustomerID"
mcon = New OracleConnection(ConfigurationSettings.AppSettings("conStringOraNw"))
mda = New OracleDataAdapter(strSQL, mcon)
mcb = New OracleCommandBuilder(mda)
If Not IsPostBack Then
BindGrid()
Else
mdt = CType(Session(mCacheKey), DataTable)
End If
End Sub
3. Sub
BindGridの書き換え
Sub BindGridを以下のように書き換えます。DataTableをセッションステートに保存して高速化します。
Private Sub BindGrid()
If mdt Is Nothing Then
mdt = CreateDataTable()
Dim dc As DataColumn = mdt.Columns("CustomerID")
With dc
.AutoIncrement = True
.AutoIncrementSeed = -1
.AutoIncrementStep = -1
End With
mdt.PrimaryKey = New DataColumn() {dc}
Session(mCacheKey) = mdt
End If
With DataGrid1
.DataSource = mdt
.DataKeyField = "CustomerID"
.DataBind()
End With
End Sub
4.
Function CreateDataTableを追加
クラスモジュールの最後にFunction CreateDataTableを追加します。
Private Function CreateDataTable() As DataTable
mdt = New DataTable
mda.Fill(mdt)
Return mdt
End Function
5.
Function InsertRecordの書き換え
Function InsertRecordを以下のように書き換えます。DataTableのRowsコレクションから空白行のDataRowを取得します。DataRowの得意先(CompanyName)、担当(ContactName)、電話(Phone)列を更新します。DataTableに追加したレコード(DataRow)をOracleデータベースに反映するには、OracleDataAdapterのUpdateメソッドを使用します。
Private Function InsertRecord(ByVal strCompanyName As String, _
ByVal strContactName As String, _
ByVal strPhone As String) As Integer
Dim intRetValue As Integer = 0
Dim dr As DataRow = mdt.Rows(mdt.Rows.Count - 1)
dr("CompanyName") = strCompanyName
dr("ContactName") = strContactName
dr("Phone") = strPhone
Try
mda.Update(mdt)
intRetValue = 1
Catch ex As Exception
Response.Write(ex.Message.ToString)
End Try
Return intRetValue
End Function
■解説
OracleDataAdapterオブジェクトのUpdateメソッドでDataSet、DataTableに追加、更新、削除したレコードをOracleデータベースに反映するには、OracleCommandBuilderで追加、更新、削除するSQL文を生成します。OracleCommandBuilderは、OracleDataAdapterのSelectCommandプロパティに格納されているSELECT文を基にこれらのSQLを生成します。
OracleDataAdapterのUpdatelメソッドを使用するには、OracleデータベースのCustomers表に直接レコードを追加する代わりにDataTableにレコードを追加します。
DataTableにレコードを追加するには、DataTableオブジェクトのNewRowメソッドでDataRowオブジェクトを作成して、RowsコレクションのAddメソッドでDataTableに追加します。
Dim dr As DataRow = mdt.NewRow
・・・
dr("CompanyName") = strCompanyName
dr("ContactName") = strContactName
dr("Phone") = strPhone
・・・
mdt.Rows.Add(dr)
OracleDataAdapterのUpdateメソッドを実行すると、DataTableに追加、更新、削除したレコードがOracleデータベースに反映されます。Updateメソッドの引数には、DataSetまたはDataTableを指定します。ここでは、DataTableを指定しています。
Private Function InsertRecord(ByVal strCompanyName As String, _
ByVal strContactName As String, _
ByVal strPhone As String) As Integer
Dim intRetValue As Integer = 0
Dim dr As DataRow = mdt.Rows(mdt.Rows.Count - 1)
dr("CompanyName") = strCompanyName
dr("ContactName") = strContactName
dr("Phone") = strPhone
Try
mda.Update(mdt)
intRetValue = 1
Catch ex As Exception
Response.Write(ex.Message.ToString)
End Try
Return intRetValue
End Function