我在尝试更新数据库中的某个值时遇到问题,如果通过Google提供任何帮助,则无法找到更多问题。
如果此条目的EndDate是今天(现在),我想设置一个名为IsOpen的列(bool但因为SQLite我使用的是整数)为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);
我的更新&lt;&gt;看起来像;
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更改为类似的东西; WHERE IsOpen ='1'然后它将更新所有具有1到0的值,但它仍然会给我“无法更新List1:它没有PK”消息。
检查EndDate = now时,可能是我的WHERE错了?我打开页面后立即执行所有这些操作。有任何想法吗?
感谢。
答案 0 :(得分:0)
&#34; [SQLite.AutoIncrement,SQLite.PrimaryKey]&#34;是C#代码,而不是SQL代码。仅仅因为你在C#中定义了你的主键是什么,并不意味着SQLite表就是这样定义的。您需要查看表本身,因为它在SQLite中定义以修复它。
答案 1 :(得分:0)
我的更新方法导致了问题。更改了它并开始使用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();
});
}
}
}