如何使用SQLite.Net设置多个PRAGMA?

4

在连接到数据库后,我可以设置一个 PRAGMA,但第二个总是失败。我如何使用 SQLite.Net-PCL 3.1.1 设置这两个 PRAGMA?这是用于通用 Windows 平台应用程序的。

    public static SQLiteConnection Open()
    {
        if (db == null)
        {
            var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, DatabaseFileName);
            db = new SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), dbPath);
            db.Execute("PRAGMA foreign_keys = ON");
            db.Execute("PRAGMA journal_mode = WAL");
        }
        return db;
    }

在第二个执行语句之后,我从SQLite中获得了一个"Row"异常。

请求的堆栈跟踪:

  • 在SQLite.Net.SQLiteCommand.ExecuteNonQuery()处
  • 在SQLite.Net.SQLiteConnection.Execute(String query, Object[] args)处
  • 在SceneLocker.Models.DBConnection.Open()处

编辑:添加捕获的异常屏幕截图:

Trapped Exception


3
感谢您保密实际的错误信息。 - CL.
异常内容只是说“行”。 - James
1
你是在暗示说你只得到了一个空屏幕,上面什么都没有,只有“row”这个单词吗? - CL.
1
编辑是一个改进,但一般而言,请尽量避免图片。其中的文本无法被谷歌搜索。请添加完整的堆栈跟踪文本。 - H H
1个回答

7

我在第二个执行语句后立即从SQLite收到一个“行”异常。

“行”异常意味着该语句返回了一行结果,而db.Execute不支持此功能。

作为解决方法,您可以使用db.CreateCommand来执行该语句:

var dbPath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "MyDB.db");
db = new SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), dbPath);
db.Execute("PRAGMA journal_mode=DELETE");
var cmd=db.CreateCommand("PRAGMA journal_mode=WAL",new object[] { });//use db.CreateCommand
var result=cmd.ExecuteQuery<object>();//execute the command

非常感谢你! - James
3
我将此标记为答案,因为它让我意识到第二个Execute语句正在返回结果。我用ExecuteScalar<string>替换了第二个Execute,它完美地解决了问题。 - James

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