我做了大量的研究,阅读了很多帖子,而且我发现没有使用带有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个命令将在不同的连接上处理,我怀疑。
任何帮助表示感谢。
答案 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