SQLite更新"无法更新List1:它没有PK"

时间:2015-04-08 13:52:40

标签: c# sql sqlite datetime windows-phone-8

我在尝试更新数据库中的某个值时遇到问题,如果通过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错了?我打开页面后立即执行所有这些操作。有任何想法吗?

感谢。

2 个答案:

答案 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();
                });
        }
    }
}