我在尝试更新数据库上的值时遇到了问题,通过谷歌找不到太多帮助。
如果这个条目的EndDate是today(现在),我想将一个名为IsOpen(bool,但由于SQLite,我使用的是integer)的列设置为0(false)。当我运行UPDATE查询时,我得到以下异常;"无法更新List1:它没有PK"。
我不明白这一点,因为我已经检查了我的Model类,我显然有一个PK集;
[SQLite.AutoIncrement, SQLite.PrimaryKey]
public int GoalID
{
get { return _goalID; }
set
{
if (_goalID != value)
_goalID = value;
OnPropertyChanged("GoalID");
}
}
我正在尝试以这种方式进行更新;
string sql = @"UPDATE GoalsTrackerModel
SET IsOpen = '0'
WHERE EndDate = datetime('now')"; // I've also tried date('now')
_dbHelper.Update<GoalsTrackerModel>(sql);
我的更新<>看起来像;
public void Update<T>(string stmt) where T : new()
{
using (var conn = new SQLiteConnection(App.ConnectionString))
{
var result = conn.Query<T>(stmt);
if (result != null)
{
conn.RunInTransaction(() =>
{
conn.Update(result);
});
}
}
}
但正如我所说,我不断得到"无法更新List1:它没有PK"。同样让我失望的是,如果我把WHERE改成类似的东西;如果IsOpen="1",那么它将更新所有具有1到0的值,但它仍然会给我"无法更新List1:它没有PK"的消息。
也许我的WHERE在检查EndDate=现在时出错了?我会在页面打开后立即实现所有这些。有什么想法吗?
谢谢。
问题是由我的Update方法引起的。更改了它,并开始使用SQLiteCommand和ExecuteNonQuery,而不是SQLiteConnection的Update()。
如果它能在未来帮助任何人,下面是我的新更新方法;
public void Update<T>(string stmt, string table) where T : new()
{
using (var conn = new SQLiteConnection(App.ConnectionString))
{
var result = conn.Query<T>("SELECT * FROM " + table);
if (result != null)
{
conn.RunInTransaction(() =>
{
SQLiteCommand cmd = conn.CreateCommand(stmt);
cmd.ExecuteNonQuery();
});
}
}
}