【发布时间】:2019-10-29 04:27:07
【问题描述】:
我有一个 SQLite 连接对象和一个命令对象。我使用 ExecuteNonQuery 函数在表中插入一行。如何从中获取自动增量列 (ID) 的值?
创建数据库的代码:
creationQuery = "CREATE TABLE IF NOT EXISTS MyTable ( ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT ,MyCol1 NVARCHAR, MyCol2 NVARCHAR)";
我在数据库中插入值的代码:
public void InsertIntoDB(string[] vals){
// Global connection objects (This is in an API so every time a new instance of these are created)
connObj = CreateConnection();
cmdObj = connObj.CreateCommand();
cmdObj.CommandText = "INSERT INTO MyTable ('MyCol1',MyCol2) VALUES( '" + vals[0] + "','" + vals[1] + "')";
int id = -1;
try{
cmdObj.ExecuteNonQuery();
id = (int)cmdObj.Parameters["id"].Value; // tried "@id" as well
}catch(Exception ex){
throw ex;
}
}
此代码插入正确。但是在我试图获取 ID 的行中抛出异常(System.ArgumentOutOfRangeException)。这是怎么回事/我该如何解决?
编辑 1:在 try 块中,我添加了代码来运行另一个查询“从 MyTable 中选择 max(ID)”:
try
{
cmdObj.ExecuteNonQuery();
cmdObj.CommandText = "Select Max(id) from MyTable";
SQLiteDataReader myReader = cmdObj.ExecuteReader();
while (myReader.Read())
{
id = (int)myReader["id"];
}
Console.WriteLine(id);
}
此代码引发相同的异常。
【问题讨论】:
-
插入后为什么不选择max(id)?
-
这将涉及运行另一个查询来获取 ID。不能用同一个对象来完成吗?
-
从 sqlite_sequence WHERE name='tablename'中选择 SEQ
-
在插入数据之前执行此操作
-
插入查询不返回行 ID。它只是返回它做了多少动作。如果您使用更新,它将返回 2。插入将返回 1