ASP.NET 徹底活用術のホームへ戻る

■編集したレコードを直接データベースに反映 ~dg4.aspx

 

DataAdapterUpdateメソッドを使用すると、DataTable上で追加、更新、削除したレコードを一括してデータベースに反映させることができますので非常に便利です。ところが、Updateメソッドは、複数のテーブルを結合してDataGridに表示すると使用できないなどの制約があります。このような場合は、Updateメソッドが使用するSQLを独自に用意するか、DataAdapterUpdateメソッドを使用しないで直接SQLを実行してデータベースに反映させます。ここで紹介するサンプルは、DataTableのレコードを更新する代わりに直接SQLを実行してデータベースを書き換えます。

 

SQLを直接実行してデータベースのレコードを書き換える

Private Function UpdateRecord(ByVal strCompanyName As String, _

  ByVal strContactName As String, _

  ByVal strPhone As String, _

  ByVal intCustomerID As Integer) As Integer

  Dim strSQL As String = _

    String.Format("UPDATE Customers " & _

      "SET CompanyName='{0}', " & _

      "ContactName='{1}', Phone='{2}' " & _

      "WHERE CustomerID={3}", _

      strCompanyName, strContactName, strPhone, intCustomerID.ToString)

  Dim strConnectionString As String = _

    String.Format("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source={0}", _

      Server.MapPath("~/webdb/Nwind.mdb"))

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  con.Open()

  Dim intRetValue As Integer = cmd.ExecuteNonQuery()

  con.Close()

  Return intRetValue

End Function

 

 

Tip 楽観的ロックを組み込む ~dg4tips.aspx

レコードを更新するとき、楽観的ロックを組み込むにはデータベースのテーブルに更新回数 またはタイムスタンプのフィールドを追加して、他のユーザーからレコードが変更されていないか調べます。たとえば、更新回数(ConcurrencyID)を使用するときは、UpdateRecordメソッドを次のように書き換えます。このメソッドからは、レコードが正常に更新されたときは「1」、レコードが更新されなかったときは「0」が戻ります。

 

Private Function UpdateRecord(ByVal strCompanyName As String, _

  ByVal strContactName As String, _

  ByVal strPhone As String, _

  ByVal intCustomerID As Integer, _

  ByVal intConcurrencyID As Integer) As Integer

  Dim strSQL As String = _

    String.Format("UPDATE Customers " & _

      "SET CompanyName='{0}', " & _

      "ContactName='{1}', Phone='{2}', " & _

      "ConcurrencyID=ConcurrencyID+1 " & _

      "WHERE CustomerID={3} And ConcurrencyID={4}", _

      strCompanyName, strContactName, strPhone, _

      intCustomerID.ToString, intConcurrencyID.ToString)

  Dim strConnectionString As String = _

    String.Format("PROVIDER=Microsoft.Jet.OLEDB.4.0;DATA Source={0}", _

      Server.MapPath("~/webdb/Nwind.mdb"))

  Dim con As New OleDbConnection(strConnectionString)

  Dim cmd As New OleDbCommand(strSQL, con)

  con.Open()

  Dim intRetValue As Integer = cmd.ExecuteNonQuery()

  con.Close()

  Return intRetValue

End Function

 

 

ASP.NET 徹底活用術のホームへ戻る