SQLite Update "Cannot update List1: it has no PK"



我在尝试更新数据库上的值时遇到了问题,通过谷歌找不到太多帮助。

如果这个条目的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=现在时出错了?我会在页面打开后立即实现所有这些。有什么想法吗?

谢谢。

"[SQLite.AutoIncrement,SQLite.PrimaryKey]"是C#代码,而不是SQL代码。仅仅因为您在C#中定义了主键是什么,并不意味着SQLite表真的是这样定义的。您需要查看SQLite中定义的表本身来解决这个问题。

问题是由我的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();
                });
        }
    }
}

相关内容

最新更新