c# - 如何使用 SQLiteCommand 对象获取自动递增的 ID 插入行
问题描述
我有一个 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);
}
此代码引发相同的异常。
解决方案
select last_insert_rowid();
您需要将其作为标量查询执行。
string sql = @"select last_insert_rowid()";
long lastId = (long)command.ExecuteScalar(sql); // Need to type-cast since `ExecuteScalar` returns an object.
推荐阅读
- python - 如何根据类型自动拆分 Python 列表?
- powershell - 方法调用失败,因为 [System.Object[]] 不包含名为“op_Division”的方法
- excel - Excel VBA - 使用数字 1 到 3 的宏填充行超出所需范围
- docker - 启用从 Docker 容器到外部世界的转发
- php - 在 WooCommerce 产品价格范围内用斜线替换破折号
- kubernetes - 如何列出自定义资源定义 (CRD) 的所有对象,例如当 CRD 冲突时?
- logging - 按应用程序划分的 IIS 流量细分
- django - Django:对象和引用对象字段访问
- r - 在 R 中加载先知库时出错 - 我该如何解决?
- apache2.4 - 如何在同一台服务器上运行 symfony 和非 symfony 项目