VB.Net SQLite last_insert_rowid总是使用edmx(EF6)

时间:2016-03-11 08:16:57

标签: vb.net sqlite entity-framework-6

我做了大量的研究,阅读了很多帖子,而且我发现没有使用带有EF6的edmx(实体数据模型)。 这是我的问题: 简单的表...

CREATE TABLE Oops (
OopsID INTEGER       NOT NULL
                     PRIMARY KEY AUTOINCREMENT,
UserID INTEGER       NOT NULL
                     REFERENCES Users (UserID),
Reason VARCHAR (100) NOT NULL

);

我正在尝试检索插入的最后一个OopsID。 在VB.Net中,我尝试了以下内容:

Dim dbContext As New RCA.Entities
' Always returns 1
Dim rtnVal1 As Int64 = dbContext.Database.ExecuteSqlCommand("INSERT INTO Oops (UserID,Reason) VALUES(" & clsShared.iUserID & ",'" & txtReason.Text & "'); SELECT last_insert_rowid() FROM Oops;")

' Always returns -1
Dim rtnVal2 = dbContext.Database.ExecuteSqlCommand("INSERT INTO Oops (UserID,Reason) VALUES(" & clsShared.iUserID & ",'" & txtReason.Text & "'); SELECT SEQ from sqlite_sequence WHERE name='Oops';")

然而,SQLiteStudio中的以下查询返回7,正确的值:

SELECT SEQ from sqlite_sequence WHERE name='Oops'

似乎一个语句中的2个命令将在不同的连接上处理,我怀疑。

任何帮助表示感谢。

2 个答案:

答案 0 :(得分:0)

这段代码最终对我有用:

    Using dbContextTransaction = dbContext.Database.BeginTransaction()
      Try
        dbContext.Database.ExecuteSqlCommand("INSERT INTO Oops (UserID,Reason) VALUES(" & clsShared.iUserID & ",'" & txtReason.Text & "')")
        Dim rtnVal = dbContext.Database.SqlQuery(Of Int64)("SELECT last_insert_rowid();").ToList

        dbContextTransaction.Commit()
      Catch generatedExceptionName As Exception
        dbContextTransaction.Rollback()
      End Try
    End Using

一个FYI,我最初从ExecuteSqlCommand获取的值“1”是受影响的行数。

答案 1 :(得分:-1)

你应该写

SELECT SCOPE_IDENTITY()

获取最后插入的ID