HOWTO: 通过使用 VisualBasic.NET 将记录插入 Access 数据库时检索标识值

HOWTO: 通过使用 VisualBasic.NET 将记录插入 Access 数据库时检索标识值

<script type="text/javascript">function loadTOCNode(){}</script>
文章编号:815629
最后修改:2007年5月12日
修订:3.1
<script type="text/javascript"> var sectionFilter = "type != 'notice' && type != 'securedata' && type != 'querywords'"; var tocArrow = "/library/images/support/kbgraphics/public/en-us/downarrow.gif"; var depthLimit = 10; var depth3Limit = 10; var depth4Limit = 5; var depth5Limit = 3; var tocEntryMinimum = 1; </script> <script src="/common/script/gsfx/kbtoc.js?13" type="text/javascript"></script>

概要

<script type="text/javascript">loadTOCNode(1, 'summary');</script>
本文讨论如何从 Access 数据库检索标识列值。

从 Jet 数据库检索标识值是不同于与 SQLServer, 因为 Jet 数据库不支持多语句批处理命令。 JetOLEDB 版本 4.0 提供支持 @@Identity SELECT 查询, 可以检索您连接上生成自动递增字段的值。 以运行查询, SELECT @@Identity 建议您使用其他 OleDbCommand 对象。 本文介绍如何使用二 OleDbCommand 来检索标识列值。

注意: 此功能适用于 OLEDB Microsoft Jet 4.0 数据库只。 早期版本的 Microsoft Jet OLEDB 不支持此功能。

回到顶端

更多信息

<script type="text/javascript">loadTOCNode(1, 'moreinformation');</script>

连接到 Access 数据库

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 要接到 Access 数据库并创建表与标识列, 请按照下列步骤操作:
1.启动 Microsoft Visual Studio NET 2002。
2.在 文件 菜单, 指向 新建 , 然后单击 项目 。
3.项目类型 下单击 VisualBasic 项目 。 模板 部分, 下单击 控制台应用程序 。 默认情况下, 创建 Module 1。
4.命名 MyJetApplication 项目, 然后单击 确定 。
5.用以下代码替换现有代码:
Imports System
Imports 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 数据库中数据源名称。




回到顶端

捕获标识列值

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script> 来汇总 RowUpdated 事件的 DataAdapter, 中步骤, 您来捕获标识列值为 Access 数据库中表列生成。 RowUpdated 事件, 中通过其他 Command 对象, 将执行 SELECT @ @ IDENTITY 查询, 然后您将分配到标识列由查询返回值。 最后, 调用 AcceptChanges 方法要接受列值的 DataRow 对象。

请标识列值, 陷阱执行以下步骤:
1.添加下列代码之前 Main 方法来创建另一个 OleDbCommand 对象用于 SELECT @ @ IDENTITY 查询:
   ' Create OleDbCommand for SELECT @@IDENTITY statement
   Private cmdGetIdentity As OleDbCommand
2.以下代码附加到 Main 方法用于创建 OleDbCommand 类的新实例:
      ' Create another command to get IDENTITY value.
      cmdGetIdentity = New OleDbCommand()
      cmdGetIdentity.CommandText = "SELECT @@IDENTITY"
      cmdGetIdentity.Connection = cnJetDB

3.以下代码附加到 Main 方法用于处理 RowUpdated 事件:
      ' Delegate for handling RowUpdated event.
      AddHandler oleDa.RowUpdated, AddressOf HandleRowUpdated
4.以下代码附加到 Main 方法用于更新数据。 调用 Update 方法后引发 RowUpdated 事件。
      ' Update the Data
      oleDa.Update(dtTest)
5.以下代码附加到 Main 方法释放资源和除去 AutoIncrementTest 表:
      ' 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 事件处理代码添加到 Module 1:
   ' 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.在 调试 菜单, 单击 开始 以运行该应用程序。 标识列值输出窗口中显示。


回到顶端

完成代码列表

<script type="text/javascript">loadTOCNode(2, 'moreinformation');</script>
Imports System
Imports 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

回到顶端

参考

<script type="text/javascript">loadTOCNode(1, 'references');</script>
请单击下列文章编号以查看 Microsoft 知识库中相应有关 Visual Basic 6.0, 中相关主题:
232144 (http://support.microsoft.com/kb/232144/EN-US/) Jet 4.0 OLE DB Provider 支持 SELECT @@identity INFO:
有关详细信息, 请访问以下 MSDN 网站:
OleDbDataAdapter.RowUpdated 事件
http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated(vs.71).aspx (http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated(vs.71).aspx)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值