2

我厌倦了搜索,所以这是我的第一个 SO 问题,希望有人遇到同样的问题并且可以帮助我

目标

我正在尝试使用 SQLite 数据库存储我的应用程序数据

应用说明

Windows 8 应用 C# XAML 与本地 SQLite 数据库使用SQLite for Windows 运行时扩展sqlite-net

表定义

public class Product {
    private int _id;

    [SQLite.PrimaryKey, SQLite.AutoIncrement]
    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }

    private string _date;
    public string DATE
    {
        get { return _date; }
        set { _date = value; }
    }

    private string _desc;
    public string DESC
    {
        get { return _desc; }
        set { _desc = value; }
    }
}

问题1

public int Insert (object obj)描述如下:

插入给定对象并检索其自动递增的主键(如果有)。

但是,每次我插入一行时,它都会返回1。我可以使用自动增量 ID 成功插入,但不知何故它没有返回我的 ID。为什么?

问题 2

我可以插入新行但不能删除它们

解决问题 1 以获取最后一行生成的 ID,我尝试删除行但没有成功。

请参阅始终失败的示例测试:

using (var db = new SQLiteConnection(Path.Combine(_path, _dbname)))
{
    var p1 = new Product() { DESC = "insert1", DATE = DateTime.Now.ToString() };
    db.Insert(p1);
    p1.ID = 1;
    var p2 = new Product() { DESC = "insert2", DATE = DateTime.Now.ToString() };
    // I am sure that this row is getting ID 2, so it will not have a wrong ID
    p2.ID = 2;
    db.Insert(p2);
    var p3 = new Product() { DESC = "insert3", DATE = DateTime.Now.ToString() };
    db.Insert(p3);
    p3.ID = 3;
    db.Delete<Product>(p2);
}

如您所见,我尝试插入 3 行并删除第二行。行已插入,但我得到以下SQLite.SQLiteException异常:

由于未完成的语句或未完成的备份而无法关闭

为什么?在那之前和之后我不打开其他连接。


提前致谢

解决了

问题 1

+1 并感谢@Bridgey 指出该功能与其描述不匹配并进行相关搜索

该函数不会像它所说的那样返回 ID,但它定义了对象 ID。因此,当我插入一个新Product时,Product.ID将具有最后插入的 ID。

问题 2

我改成现在它可以工作了db.Delete<Product>(p2);db.Delete(p2);SQLite-net 正确地将行标识为Product。我仍然不知道为什么由于未完成的语句或未完成的备份异常而无法关闭。如果有人知道为什么请告诉我。

4

1 回答 1

4

我认为对于问题 2,问题在于您将 Product 对象作为 Delete 方法的参数传递。文档说:删除具有指定主键的对象。我认为以下应该有效:

db.Delete<Product>(p1.ID);

关于问题1,sqlite-net包的Insert方法代码结束:

var count = insertCmd.ExecuteNonQuery (vals);

if (map.HasAutoIncPK) {
  var id = SQLite3.LastInsertRowid (Handle);
  map.SetAutoIncPK (obj, id);
}

return count;

如您所见,count即使id已设置,也会返回。

编辑:实际上,根据作者的说法,这是故意的。“插入返回修改的行数。自动递增的列存储在对象中。请参阅文档注释。” https://github.com/praeclarum/sqlite-net/issues/37

于 2013-02-21T23:14:41.530 回答