如何: 检索标识值时使用 Visual Basic.net 将 Access 数据库插入的记录

文章翻译 文章翻译
文章编号: 815629 - 查看本文应用于的产品
展开全部 | 关闭全部

本文内容

概要

本分步指南介绍讨论了如何从 Access 数据库中检索标识列的值。

从 Jet 数据库中检索标识值是不同于 SQL Server,因为 Jet 数据库不支持多语句批处理命令。Jet OLE DB 版本 4.0 提供程序支持 SELECT @ @ 身份 查询,允许您检索生成您的连接上的自动递增字段的值。若要进行 SELECT @ @ 身份 查询则建议您使用另一个 OleDbCommand 对象。本文介绍如何使用第二个的 OleDbCommand 检索标识列的值。

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

更多信息

连接到 Access 数据库

若要连接到 Access 数据库,并创建一个包含标识列的表,请按照下列步骤:
  1. 启动 Microsoft Visual Studio.net 2002年。
  2. 文件 菜单上指向 新建,然后单击 项目
  3. 项目类型 框中,单击 Visual Basic 项目。在 模板 部分下单击 控制台应用程序。默认状态下,创建 Module1.vb。
  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 数据库中的数据源名称。




补漏白列的标识值

若要汇总的 DataAdapter,RowUpdated 事件中的该步骤可补漏白标识列生成的 Access 数据库中表的某一列的值。RowUpdated 事件中使用另一个 命令 对象,将运行该 SELECT @ @ IDENTITY 查询,然后您会将由查询返回到标识列的值分配。最后,调用 AcceptChanges 方法的 DataRow 对象,以接受该列的值。

补漏白,标识列值请按照下列步骤操作:
  1. 添加下面的代码之前要创建第二个 OleDbCommand 对象为 SELECT @ @ IDENTITY 查询 Main 方法:
       ' 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 方法用于更新数据。RowUpdated 事件引发之后调用 Update 方法。
          ' 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 事件处理程序代码添加到模块 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. 调试 菜单上单击 $ 开始 以运行该应用程序。在输出窗口中显示标识列的值。


完成代码列表

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

参考

在 Visual Basic 6.0 中的相关主题有关的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
232144信息: Jet OLE DB 提供程序版本 4.0 Supports SELECT @ @ 标识
有关详细的信息,请访问下面的 MSDN 网站:
OleDbDataAdapter.RowUpdated 事件
http://msdn2.microsoft.com/en-us/library/system.data.oledb.oledbdataadapter.rowupdated(vs.71).aspx

属性

文章编号: 815629 - 最后修改: 2007年5月12日 - 修订: 3.2
这篇文章中的信息适用于:
  • Microsoft ADO.NET 1.0
  • Microsoft ADO.NET 1.1
  • Microsoft Visual .NET 2002 标准版
  • Microsoft Visual Basic .NET 2003 标准版
关键字:?
kbmt kbjet kbprogramming kbtsql kbsystemdata kbhowtomaster KB815629 KbMtzh
机器翻译
注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。
点击这里察看该文章的英文版: 815629
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com