ASP.NET + Oracle Part3 のホームへ戻る

DataAdapterUpdateメソッドでデータベースに反映する – SQL自動生成 (ch58DataGrid2.aspx)

 

DataGridから追加した行(レコード)をOracleデータベースに反映するのに、OracleDataAdapterUpdateメソッドを使用します。Updateメソッドが使用するSQL文は、OracleCommandBuilderで自動生成します。OracleCommandBuilderは、OracleDataAdapterSelectCommandに格納されているSELECT文を基に追加、更新、削除のSQL文を生成します。

 

このサンプルでは、以下のノウハウを習得することができます。

 

DataGridから新規登録した行(レコード)をデータベースに反映するのにDataAdapterUpdateメソッドを使用する方法

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イベントを以下のように書き換えます。OracleConnectionOracleDataAdapterのインスタンスを生成したら、OracleCommandBuilderのインスタンスを生成して追加、更新、削除用のSQL文を生成します。

 

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs)

cccHandles 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を以下のように書き換えます。DataTableRowsコレクションから空白行のDataRowを取得します。DataRowの得意先(CompanyName)、担当(ContactName)、電話(Phone)列を更新します。DataTableに追加したレコード(DataRow)Oracleデータベースに反映するには、OracleDataAdapterUpdateメソッドを使用します。

 

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メソッドでDataSetDataTableに追加、更新、削除したレコードをOracleデータベースに反映するには、OracleCommandBuilderで追加、更新、削除するSQL文を生成します。OracleCommandBuilderは、OracleDataAdapterSelectCommandプロパティに格納されているSELECT文を基にこれらのSQLを生成します。

 

OracleDataAdapterUpdatelメソッドを使用するには、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)

 

OracleDataAdapterUpdateメソッドを実行すると、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

 

ASP.NET + Oracle Part3 のホームへ戻る