【问题标题】:Howto to access the tables of an attached database?如何访问附加数据库的表?
【发布时间】:2013-11-29 17:33:09
【问题描述】:

我在 Windows Phone 8 项目上使用 sqlite-winrt 来处理 SQLite 数据库。效果很好,除了附加数据库的问题:

有两个相同的数据库(相同的表,不同的内容)A和B。B附加到A:

database dbA = new  Database(dbAFile);
await dbA.OpenAsync();

await dbA.ExecuteStatementAsync("ATTACH B.sqlite AS AttachDB");

query = "SELECT * FROM SomeTable";
using (Statement sqlStatement = await dbA.PrepareStatementAsync(query)) {
   while (await sqlStatement.StepAsync()) {
      ...List Content of SomeTable in Table A --> No Problem
   }
}

query = "SELECT * FROM AttachDB.SomeTable";
using (Statement sqlStatement = await dbA.PrepareStatementAsync(query)) {
   while (await sqlStatement.StepAsync()) {
      ...List Content of SomeTable in Table B --> Crash in PrepareStatementAsync
   }
}

当用于访问附加数据库中的表“SomeTable”时,在准备语句时会引发异常。异常没有显示问题的根源,但我设法得到了 SQL 错误消息,即:

“没有这样的表:AttachDB.SomeTable”

当然数据库 B 有一个表“SomeTable”。当我直接连接到这个数据库时,我可以毫无问题地访问表“SomeTable”。

我认为 B 与 A 具有完全相同的表并在 B 中创建表“OnlyInB”可能是一个问题。但访问 AttachDB.OnlyInB 也失败。根据sqlite doc,当表名唯一时,可以跳过数据库名。因此“OnlyInB”也应该起作用。但不是。 "SELECT * FROM OnlyInB" 显示 "no such table: OnlyInB"

我使用 Firefox 的“SQLite Manager”扩展测试相同的场景(打开 A,附加,B...)从 AttachDB.SomeTable 或 B 中的任何其他表中选择数据在那里没有问题。该问题仅在使用 sqlite-winrt 时出现。

我还测试了将 B 连接到 A 是否有任何问题。但没有。当我尝试附加 B 两次或再次使用“AttachDB”附加第三个数据库时,会显示一个错误,清楚地表明 B 已正确附加到 A。附加似乎工作完美,除了我无法访问任何表的问题乙...

有什么建议吗? 非常感谢!

【问题讨论】:

    标签: c# sqlite windows-phone-8


    【解决方案1】:

    此声明:

    ATTACH B.sqlite AS AttachDB
    

    不是有效的 SQL;文件名必须是字符串。

    在任何情况下,您都应该始终包含数据库文件的完整路径;否则,SQLite 将在当前路径中打开数据库,如果文件不存在,则尝试创建一个新的空数据库:

    ATTACH '/some/where/B.sqlite' AS AttachDB
    

    【讨论】:

      猜你喜欢
      • 2022-08-16
      • 2011-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 2021-07-24
      • 2011-05-14
      • 1970-01-01
      相关资源
      最近更新 更多