【问题标题】:SQLite exception deleting row using sqlite-net使用 sqlite-net 删除行的 SQLite 异常
【发布时间】:2013-02-23 06:34:12
【问题描述】:

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

目标

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

应用说明

Windows 8 应用 C# XAML 与本地 SQLite 数据库,使用 SQLite for Windows Runtime Extensionsqlite-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&lt;Product&gt;(p2); 更改为db.Delete(p2);,现在它可以工作了。 SQLite-net 正确地将行识别为 Product。我仍然不知道为什么会发生由于未完成的语句或未完成的备份而无法关闭异常。如果有人知道为什么请告诉我。

【问题讨论】:

  • 我认为问题 1 实际上不是问题。我认为 SQLite 的 INSERT 返回添加的行数(1),而不是新插入行的行 ID。可能需要:sqlite.org/c3ref/last_insert_rowid.html
  • @Bridgey 插入给定对象并检索其自动递增的主键(如果有)。您可以在类内的方法描述中看到这一点
  • 你说得对,这就是文档所说的,但看起来可能存在错误。如果你看 sqlite-net 的 public int Insert(object obj, string extra, Type objType) [SQLite.cs],它似乎总是返回插入的行数。
  • @Bridgey 感谢您的帮助。我更改了函数以返回最后一个 ID。也许它会在下一个版本中修复。我会尝试联系作者。

标签: c# sqlite windows-8 windows-store-apps windows-store


【解决方案1】:

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

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

【讨论】:

  • 你对问题 1 是正确的。关于问题 2 我已经知道我可以通过它的 ID 删除。但我试图做的是按对象删除。请参阅我编辑的问题。感谢您的帮助,您有我的投票权
猜你喜欢
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多