【问题标题】:How to get the autoincremented ID inserted row using SQLiteCommand object如何使用 SQLCommand 对象获取自动增量 ID 插入行
【发布时间】: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

标签: c# sqlite


【解决方案1】:
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.

【讨论】:

    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-07
    • 2012-01-18
    相关资源
    最近更新 更多