我使用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)
您可以将两个查询合并为一个命令,而不是调用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 的回答指出了此解决方案的一些缺点。
| 归档时间: |
|
| 查看次数: |
612 次 |
| 最近记录: |