繁体   English   中英

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

[英]Get last insert rowid using Microsoft.Data.Sqlite C#

我使用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;
    }
}

您可以将两个查询组合成一个命令,而不是调用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();
    }
}

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

您检索 rowid 的初始方式(通过分隔插入和 select 命令)更合适且更“安全”。 结合 INSERT 和 SELECT 命令将在表中插入数据时忽略唯一约束违规(如果您有唯一索引)。 您将简单地获得“0”作为新的 rowid - 并且不会抛出异常!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM