在更新查询期间它抛出NotSupportedException?

时间:2013-07-03 11:06:16

标签: c# sqlite windows-8

我在windows store application中处理SQLite。我正在使用

更新表中的值
var tagPage = db.QueryAsync<MyModel>("UPDATE MyModel SET Tag =2 WHERE id = 1");
db.UpdateAsync(tagPage);

它通过方法

在SQLite.cs类上抛出NotSupportedException
public int Update(object obj, Type objType)
{
    if (obj == null || objType == null)
        {
            return 0;
        }

        var map = GetMapping(objType);

        var pk = map.PK;

        if (pk == null)
        {
            throw new NotSupportedException("Cannot update " + map.TableName + ": it has no PK");
        }

        var cols = from p in map.Columns
                   where p != pk
                   select p;
        var vals = from c in cols
                   select c.GetValue(obj);
        var ps = new List<object>(vals);
        ps.Add(pk.GetValue(obj));
        var q = string.Format("update \"{0}\" set {1} where {2} = ? ", map.TableName, string.Join(",", (from c in cols
                                                                                                        select "\"" + c.Name + "\" = ? ").ToArray()), pk.Name);
        return Execute(q, ps.ToArray());
}

因为我认为它不会获得质量密钥,我在表格中提供了质量密钥。 我尝试使用异步并等待但没有用,为什么会发生?请帮帮我

1 个答案:

答案 0 :(得分:4)

关于您的NotSupportedException问题 - 我怀疑您的模型缺少PrimaryKey属性:

public class MyModel
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }

    public int Tag { get; set; }        
    public string Foo { get; set; }
}

您将需要上面的属性,即使您的数据库模式已经定义了它们。目前,Sqlite-Net不会从db中读取架构数据。

其他一些想法:

首先,您应该只使用同步Sqlite-Net API或异步API。不要同时使用两者。

我个人更喜欢同步API,因为它似乎更新。异步API尚未在11个月内更新,而同步API在4个月前更新。除此之外,我无法弄清楚如何使用异步API进行事务处理。再次,这是个人偏好。

其次,QueryQueryAsync方法仅应用于查询(SELECT s)。它们不应该用于UPDATE。要添加/更改数据,您需要使用以下同步方法:ExecuteUpdateInsert等。如果使用异步API,则存在异步对应方({{1等等)。

请阅读Sqlite-Net Project page,因为您会在那里找到有关常规API使用的大量有用信息。