Visual Basic .NET を使用してデータベースの Access にレコードを挿入するときに Id 値を取得する方法

Microsoft Visual C# .NET 版のこの資料には、次を参照してください。
816112

この作業では

概要

この資料では、Access データベースの id 列の値を取得する方法について説明します。

Jet データベースの Id 値を取得するとは異なる SQL Server での Jet データベースは、複数のステートメントのバッチ コマンドをサポートしていないためです。Jet OLE DB バージョン 4.0 プロバイダーは、 @@Identity を選択してクエリをサポートできるようにする接続で生成される自動インクリメント フィールドの値を取得するために。@@Identity を選択してクエリを実行するには、別のOleDbCommandオブジェクトを使用することをお勧めします。この資料では、Id 列の値を取得するために 2 つ目の発行を使用する方法について説明します。

注:この機能は、Jet 4.0 ole DB データベースでのみ動作します。以前のバージョンの Microsoft Jet ole DB は、この機能をサポートしません。

先頭に戻る

詳細

Access データベースへの接続します。

Access データベースに接続し、Id 列を持つテーブルを作成、次の手順を実行します。
  1. Microsoft Visual Studio .NET 2002年を起動します。
  2. [ファイル] メニューのをポイントします。
    新規作成し、[プロジェクト] をクリックします。
  3. [プロジェクトの種類Visual Basic プロジェクト] をクリックします。[テンプレート] セクションで次のようにクリックします。
    コンソール アプリケーションです。デフォルトで Module1.vb が作成されます。
  4. MyJetApplicationプロジェクトの名前し、[ OK] をクリックします。
  5. 既存のコードを次のコードに置き換えます。
    Imports SystemImports System.Data
    Imports System.Data.OleDb

    Module Module1

    Sub Main()

    ' Open Connection
    Dim cnJetDB As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=YourAccessDatabase")
    cnJetDB.Open()

    ' If the test table does not exist, create the Table.
    Dim strSQL As String
    strSQL = "CREATE TABLE AutoIncrementTest " & _
    "(ID int identity, Description varchar(40), " & _
    "CONSTRAINT AutoIncrementTest_PrimaryKey PRIMARY KEY (ID))"

    ' Command for creating Table.
    Dim cmdJetDB As New OleDbCommand(strSQL, cnJetDB)
    cmdJetDB.ExecuteNonQuery()

    ' Create a DataAdaptor With Insert Command For inserting records
    Dim oleDa As New OleDbDataAdapter("Select * from AutoIncrementTest", cnJetDB)


    ' Command to Insert Records.
    Dim cmdInsert As New OleDbCommand()
    cmdInsert.CommandText = "INSERT INTO AutoIncrementTest (Description) VALUES (?)"
    cmdInsert.Connection = cnJetDB
    cmdInsert.Parameters.Add(New OleDbParameter("Description", OleDbType.VarChar, 40, "Description"))
    oleDa.InsertCommand = cmdInsert

    ' Create a DataTable
    Dim dtTest As New DataTable()
    oleDa.Fill(dtTest)

    Dim drTest As DataRow

    ' Add Rows to the Table
    drTest = dtTest.NewRow
    drTest("Description") = "This is a Test Row 1"
    dtTest.Rows.Add(drTest)

    drTest = dtTest.NewRow
    drTest("Description") = "This is a Test Row 2"
    dtTest.Rows.Add(drTest)

    End Sub

    End Module

  6. Access データベースを指す接続文字列でデータ ソース名を変更します。


先頭に戻る

Id 列の値をトラップします。

、データ アダプターのRowUpdatedイベントでは、手順を要約するには、Access データベース内のテーブルの列に対して生成される id 列の値をトラップすることができます。RowUpdatedイベントで、もう 1 つのコマンドオブジェクトを使用して@@IDENTITY を選択してクエリを実行するし、Id 列に、クエリによって返される値を割り当てられます。最後に、列の値を受け入れるようにDataRowオブジェクトのAcceptChangesメソッドを呼び出します。

トラップ id 列の値は、これらの手順に従います。
  1. @@IDENTITY を選択するクエリの 2 番目のOleDbCommandオブジェクトを作成するのにはメインメソッドの前に次のコードを追加します。
       ' Create OleDbCommand for SELECT @@IDENTITY statement   Private cmdGetIdentity As OleDbCommand
  2. OleDbCommandクラスの新しいインスタンスを作成するためのMainメソッドに次のコードを追加します。
          ' Create another command to get IDENTITY value.      cmdGetIdentity = New OleDbCommand()
    cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
    cmdGetIdentity.Connection = cnJetDB


  3. RowUpdatedイベントを処理するためのMainメソッドに次のコードを追加します。
          ' Delegate for handling RowUpdated event.      AddHandler oleDa.RowUpdated, AddressOf HandleRowUpdated
  4. データを更新するためのMainメソッドに次のコードを追加します。RowUpdatedイベントは、 Updateメソッドを呼び出した後に発生します。
          ' Update the Data      oleDa.Update(dtTest)

  5. AutoIncrementTestテーブルを削除し、リソースを解放するには、 Mainメソッドに次のコードを追加します。
          ' Drop the table      cmdJetDB.CommandText = "DROP TABLE AutoIncrementTest"
    cmdJetDB.ExecuteNonQuery()

    ' Release the resources.
    cmdGetIdentity.Dispose()
    cmdGetIdentity = Nothing
    cmdInsert.Dispose()
    cmdInsert = Nothing
    cmdJetDB.Dispose()
    cmdJetDB = Nothing
    cnJetDB.Close()
    cnJetDB.Dispose()
    cnJetDB = Nothing
  6. 次のRowUpdatedイベント ハンドラーのコードを Module1 に追加します。
       ' Event handler for RowUpdated event.   Private Sub HandleRowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs)
    If e.Status = UpdateStatus.Continue AndAlso e.StatementType = StatementType.Insert Then
    ' Get the Identity column value
    e.Row("ID") = Int32.Parse(cmdGetIdentity.ExecuteScalar().ToString())
    Debug.WriteLine(e.Row("ID"))
    e.Row.AcceptChanges()
    End If
    End Sub

  7. [デバッグ] メニューで、次のようにクリックします。
    開始をアプリケーションを実行します。Id 列の値は、出力ウィンドウに表示されます。
先頭に戻る

完全なコード リスト

Imports SystemImports System.Data
Imports System.Data.OleDb

Module Module1

' Create OleDbCommand for SELECT @@IDENTITY statement
Private cmdGetIdentity As OleDbCommand

Sub Main()

' Open Connection
Dim cnJetDB As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=YourAccessDatabase")
cnJetDB.Open()

' If the test table does not exist then create the Table
Dim strSQL As String
strSQL = "CREATE TABLE AutoIncrementTest " & _
"(ID int identity, Description varchar(40), " & _
"CONSTRAINT AutoIncrementTest_PrimaryKey PRIMARY KEY (ID))"

' Command for Creating Table
Dim cmdJetDB As New OleDbCommand(strSQL, cnJetDB)
cmdJetDB.ExecuteNonQuery()

' Create a DataAdaptor With Insert Command For inserting records
Dim oleDa As New OleDbDataAdapter("Select * from AutoIncrementTest", cnJetDB)


' Command to Insert Records
Dim cmdInsert As New OleDbCommand()
cmdInsert.CommandText = "INSERT INTO AutoIncrementTest (Description) VALUES (?)"
cmdInsert.Connection = cnJetDB
cmdInsert.Parameters.Add(New OleDbParameter("Description", OleDbType.VarChar, 40, "Description"))
oleDa.InsertCommand = cmdInsert

' Create a DataTable
Dim dtTest As New DataTable()
oleDa.Fill(dtTest)

Dim drTest As DataRow

' Add Rows to the Table
drTest = dtTest.NewRow
drTest("Description") = "This is a Test Row 1"
dtTest.Rows.Add(drTest)

drTest = dtTest.NewRow
drTest("Description") = "This is a Test Row 2"
dtTest.Rows.Add(drTest)

' Create another Command to get IDENTITY Value
cmdGetIdentity = New OleDbCommand()
cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
cmdGetIdentity.Connection = cnJetDB

' Delegate for Handling RowUpdated event
AddHandler oleDa.RowUpdated, AddressOf HandleRowUpdated

' Update the Data
oleDa.Update(dtTest)

' Drop the table
cmdJetDB.CommandText = "DROP TABLE AutoIncrementTest"
cmdJetDB.ExecuteNonQuery()

' Release the Resources
cmdGetIdentity.Dispose()
cmdGetIdentity = Nothing
cmdInsert.Dispose()
cmdInsert = Nothing
cmdJetDB.Dispose()
cmdJetDB = Nothing
cnJetDB.Close()
cnJetDB.Dispose()
cnJetDB = Nothing
End Sub

' Event Handler for RowUpdated Event
Private Sub HandleRowUpdated(ByVal sender As Object, ByVal e As OleDbRowUpdatedEventArgs)
If e.Status = UpdateStatus.Continue AndAlso e.StatementType = StatementType.Insert Then
' Get the Identity column value
e.Row("ID") = Int32.Parse(cmdGetIdentity.ExecuteScalar().ToString())
Debug.WriteLine(e.Row("ID"))
e.Row.AcceptChanges()
End If
End Sub
End Module

関連情報

Visual Basic 6.0 の関連トピックに関する詳細については、マイクロソフト サポート技術情報の記事を表示するのには次の資料番号をクリックします。
232144 INFO: Jet OLE DB プロバイダーのバージョンが 4.0 のサポートは、@@Identity を選択
詳細については、次の MSDN Web サイトを参照してください。先頭に戻るBUG #: 2835 (コンテンツ管理)
プロパティ

文書番号:815629 - 最終更新日: 2017/02/01 - リビジョン: 1

フィードバック