使用Microsoft.Data.Sqlite C#获取最后插入的rowid

我使用Microsoft.Data.Sqlite库创建了一个带有sqlite数据库的UWP应用。插入新行后,我需要知道分配给新行的自动增量值。下面的代码使用附加的查询“ select last_insert_rowid()”,但是有没有更好的方法来获取该值?

public static int Addmovie(Movie movie)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path,DB_FILENAME);
    using (SqliteConnection db = new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        SqliteCommand cmd = new SqliteCommand();
        cmd.Connection = db;

        cmd.CommandText = "INSERT INTO Movie VALUES (NULL,@Title,@Rating)";
        cmd.Parameters.AddWithValue("@Title",movie.Title);
        cmd.Parameters.AddWithValue("@Rating",movie.Rating);

        cmd.ExecuteReader();

        // Is there a better way to get this value?
        cmd = new SqliteCommand("SELECT last_insert_rowid()",db);
        SqliteDataReader query = cmd.ExecuteReader();

        var newId = 0;
        if (query.Read())
        {
            newId = query.GetInt32(0);
        }

        db.Close();

        return newId;
    }
}
tmroybq 回答:使用Microsoft.Data.Sqlite C#获取最后插入的rowid

您最初检索 rowid 的方法(通过将插入和选择命令分开)更合适,也更“安全”。 在表中插入数据时(如果您有唯一索引),结合使用 INSERT 和 SELECT 命令将忽略违反唯一约束的情况。您将简单地将“0”作为新的 rowid - 不会抛出任何异常!

当数据无法正确插入表中时,使用单独的命令会导致 SqliteExceptions。因此我不会使用第二种“正确”的方法。最好使用您的初始代码 - 但 ExecuteNonQuery 用于 INSERTExecuteScalar 用于 SELECT last_insert_rowid()

,

您可以将两个查询合并为一个命令,而不是调用cmd.ExecuteReader()并调用cmd.ExecuteScalar()并将返回的值转换为int

public static long AddMovie(Movie movie)
{
    string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path,DB_FILENAME);
    using (SqliteConnection db = new SqliteConnection($"Filename={dbpath}"))
    {
        db.Open();

        SqliteCommand cmd = new SqliteCommand();
        cmd.Connection = db;

        cmd.CommandText = "INSERT INTO Movie VALUES (NULL,@Title,@Rating); SELECT last_insert_rowid();";
        cmd.Parameters.AddWithValue("@Title",movie.Title);
        cmd.Parameters.AddWithValue("@Rating",movie.Rating);

        return (long)cmd.ExecuteScalar();
    }
}
本文链接:https://www.f2er.com/3100312.html

大家都在问