使用SQLite net删除行时出现SQLite异常

本文关键字:SQLite 异常 删除行 net 使用 | 更新日期: 2023-09-27 18:00:32

我搜索累了,所以这里是我的第一个so问题,希望有人也有同样的问题,可以帮助我

目标

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

应用程序说明

使用SQLite for Windows Runtime ExtensionSQLite net库的带有本地SQLite数据库的Windows 8应用程序C#XAML

表定义

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时,Products.ID将具有最后插入的ID。

问题2

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

使用SQLite net删除行时出现SQLite异常

我认为对于问题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;

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

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