首页 > 解决方案 > 如何使用 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);
            }

此代码引发相同的异常。

标签: c#sqlite

解决方案


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.

推荐阅读