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

tro*_*man 2 c# sqlite

我使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)

dal*_*lle 5

您可以将两个查询合并为一个命令,而不是调用cmd.ExecuteReader()callcmd.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();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:Raycoon 的回答指出了此解决方案的一些缺点。

  • 这有点简单,尽管我必须转换为 long,而不是 int。谢谢。 (2认同)