你目前正处于脱机状态,正在等待 Internet 重新连接

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

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 815629
为这篇文章的一个 Microsoft Visual C#.net 版本,请参阅 816112

本任务中

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

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

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

back to the top
更多信息

连接到 Access 数据库

若要连接到 Access 数据库,并创建一个包含标识列的表,请按照下列步骤:
  1. 启动 Microsoft Visual Studio.net 2002年。
  2. 文件 菜单上指向 新建,然后单击 项目
  3. 项目类型 框中,单击 Visual Basic 项目。在 模板 部分下单击 控制台应用程序。默认状态下,创建 Module1.vb。
  4. 名称 MyJetApplication 该项目,然后单击 确定
  5. 将现有代码替换下面的代码:
    Imports SystemImports System.DataImports System.Data.OleDbModule 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 SubEnd Module
  6. 修改连接字符串以指向您的 Access 数据库中的数据源名称。


back to the top

补漏白列的标识值

若要汇总的 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. 调试 菜单上单击 $ 开始 以运行该应用程序。在输出窗口中显示标识列的值。
back to the top

完成代码列表

Imports SystemImports System.DataImports System.Data.OleDbModule 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 SubEnd Module
参考
在 Visual Basic 6.0 中的相关主题有关的其他信息,请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
232144信息: Jet OLE DB 提供程序版本 4.0 Supports SELECT @ @ 标识
有关详细的信息,请访问下面的 MSDN 网站:back to the top

警告:本文已自动翻译

属性

文章 ID:815629 - 上次审阅时间:05/12/2007 06:27:53 - 修订版本: 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
反馈