如何使用SQLite.NET PCL运行一批SQL语句

9
过去,我一直避免使用ORM并手工编写参数化查询等。这非常耗时,而且在首次开发应用程序时真的很麻烦。最近,我决定再次看看ORM,特别是Sqlite.NET ORM。
我想使用SQLite ORM功能,但也希望能够运行一批本地SQL命令来预填充数据库。
我们正在使用SqliteNetExtensions-MvvmCross dll来启用一对多关系等,这看起来都很好。我的问题出在当我想用配置数据填充数据库时。我希望只需提供一个包含一系列SQL语句的SQL文件,它就会按顺序运行其中的每一条语句。
我从GITHub中获取了SQlite.NET代码并运行了测试。然后我扩展了StringQueryTests类,其中有一个简单的[Product]表,以执行以下操作:
     [Test]
    public void AlanTest()
    {
      StringBuilder sb = new StringBuilder(200);
      sb.Append(" DELETE FROM Product;");
      sb.Append(" INSERT INTO Product VALUES (1,\"Name1\",1,1);");
      sb.Append(" INSERT INTO Product VALUES (2,\"Name2\",2,3);");
      db.Execute(sb.ToString());
    }

当我运行这个程序时,它没有抛出错误,实际上,它的行为似乎是只运行第一个命令。如果我将sb.ToString()的内容粘贴到sqlite数据库查询窗口中,它将正常工作。
这是预期的行为吗?如果是,我该如何克服这个问题,以便我可以使用上述方法。如果可能的话,我不想创建对象来管理所有SQL语句。
我可以看到有许多方法可以采用来克服这个问题 - 有人有解决这个问题的解决方法或建议吗?
诚挚问候,
Alan.

静默失败的错误报告 - Edward Brey
2个回答

3

你不能做:

    [Test]
    public void AlanTest()
    {
        var queries = new List<string> () 
        {
            " DELETE FROM Product",
            " INSERT INTO Product VALUES (1,\"Name1\",1,1)",
            " INSERT INTO Product VALUES (2,\"Name2\",2,3)"
        };

        db.BeginTransaction ();
        queries.ForEach (query => db.Execute (query));
        db.Commit ();
    }

您不需要事务,只需要更快的执行/检查点回滚...


3

我也遇到了这个问题。我找到了一篇博客文章,解释了原因。

以下是该文章的内容,以防丢失。

[在sqlite-net中]所有代码都正确检查结果代码并相应地抛出异常。

虽然我没有在此处发布所有相关代码,但我已经审查过它,这种行为的真正起源在于本地sqlite3.dll sqlite3_prepare_v2方法。以下是文档的相关部分:

这些例程仅编译zSql中的第一个语句,因此*pzTail指向未编译的剩余部分。 由于sqlite-net不对未编译的尾部执行任何操作,因此实际上只执行命令中的第一个语句。其余部分被静默忽略。在大多数情况下,使用sqlite-net时您不会注意到这一点。您将使用其微型ORM层或执行单个语句。唯一常见的例外是尝试执行DDL或迁移脚本,这通常是多语句批处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接