【问题标题】:vb.net sql last inserted IDvb.net sql 最后插入的ID
【发布时间】:2011-05-24 10:24:48
【问题描述】:

我正在使用带有 Access 数据库的 VB.NET,我插入了值,但我需要获取最后插入的 ID(自动编号)并将其插入到相关表中。

我试过@@IDENTITY 和 MAX(column) 但@@IDENTITY 返回零并且 MAX 不是很可靠(有时插入数据很慢,所以在插入之前获取 ID)。

Dim insertSql = datalayer.getDataTable((String.Format("INSERT INTO users (username) VALUES ({0})", username)))

Dim newID = datalayer.getDataTable((String.Format("SELECT @@IDENTITY FROM users")))


Dim con As OleDbConnection = getConnection()
con.Open()
Dim sqlCommand As OleDbCommand = New OleDbCommand(String.Format(insertSql), con)
sqlCommand.ExecuteNonQuery()

这是在两个函数中完成的,所以上面的代码可能看起来很混乱,但这只是取自两个函数。这两个语句都被执行了,但我只是展示了一个正在执行的例子。

@@IDENTITY 和 MAX 是否有替代方案,因为我似乎看不出 @@IDENTITY 出了什么问题?

感谢您的任何建议:)。

【问题讨论】:

  • 查看我的最后一次编辑,关于访问不支持在一个命令中使用多个语句。您能否确认它确实有效,或者您是否采用了其他方法?

标签: sql vb.net ms-access lastinsertid


【解决方案1】:

它比 SELECT @@IDENTITY 在与插入相同的连接(和事务)上执行绝对重要。如果您的 getDataTable() 方法为每个调用创建一个新连接,那么这就是它不起作用的原因。

更新

另一种更可取的方法是同时执行两个语句

sql = "INSERT INTO...;SELECT @@IDENTITY..." 
Dim id = sqlCommand.ExecuteScalar(sql)

再次更新

您似乎无法针对 MS Access 数据库 Running multiple SQL statements in the one operation 执行多个这样的功能。

【讨论】:

  • 嗨,是的,它不会创建新的连接。如果我只是在表单加载到数据库时建立了一个连接,那么这也适用于插入、更新等吗?谢谢
  • +1 用于提供ExecuteScalar 方法的方法,包装两个SQL 语句。那个,我从来没有想过。 =)
  • 我非常怀疑您是否可以使用 Access 合二为一地执行两个语句。
  • @Remou 似乎是你的权利stackoverflow.com/questions/770614/…
  • 在我看来,这个答案应该包含第一段之后的所有内容,因为其余部分不适用。
【解决方案2】:

您可以简单地使用以下代码。 我假设您使用了 SQLDataSource 并且事件是:

Protected Sub SqlDataSource1_Inserted(sender As Object, e As SqlDataSourceStatusEventArgs) Handles SqlDataSource1.Inserted
Dim query As String = "SELECT @@IDENTITY"
Dim cmd As New OleDbCommand(query, CType(e.Command.Connection,   OleDbConnection))
Dim newid As Integer = cmd.ExecuteScalar()
l1.Text = newid
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    相关资源
    最近更新 更多