我们正在使用 C# 创建一个 WinStore 应用程序,该应用程序将一些数据本地存储在 SQLite 数据库中。我们目前正在使用 SQLite-net 库来访问数据库。数据库中有许多表具有基于客户端数据的动态模式。这些表的架构仅在运行时已知。
我们无法使用 SQLite-net 库查询这些动态表。是否可以使用 SQLite-net 库查询这些表?是否有不同的库可以提供类似的功能?
最佳答案
sqlite_master 表包含有关数据库中对象(例如表)的元数据。您可以像查询任何其他表一样查询该表。请注意,它是一个您无法直接操作的系统表,它是在您创建数据库对象时创建/更新的。
查询表后,您将必须基于该元数据动态构建查询以查询您的动态模式。
这是另一篇涉及表查询的 SO 帖子:How to list the tables in an SQLite database file that was opened with ATTACH?
sqlite 文档中也对此进行了讨论:http://www.sqlite.org/sqlite.html
参见“旁白:查询sqlite_master表”
编辑:
因为您将基于元数据创建动态 sql,所以您需要一种方法来执行您动态构建的基于文本的 t-sql 查询。类似于 sqlite-net 中的这种方法:
public List<T> Query<T> (string query, params object[] args)
*注意:我没有直接使用 sqlite-net 来构造动态 sql,但是我使用了其他驱动程序(包括 c 驱动程序)来执行此操作。
因为它是动态 sql(除非你想生成 C# 代码并反射生成的代码),你不能做的是使用简单的泛型样式查询方法:
var query = conn.Table<Stock>().Where(v => v.Symbol.StartsWith("A"));
当您在编译时知道您的对象和表结构时,该模式最有用。
请注意,还有一个名为 sqlite_temp_master 的表,其中列出了临时表。例如,正如上面的文档所解释的那样,.tables cmdline 快捷方式实际上执行此查询:
SELECT name FROM sqlite_master
WHERE type IN ('table','view') AND name NOT LIKE 'sqlite_%'
UNION ALL
SELECT name FROM sqlite_temp_master
WHERE type IN ('table','view')
ORDER BY 1
请注意,它还会过滤掉 sqlite_%,因为该前缀是为系统表保留的。
关于c# - 查询模式仅在运行时已知的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15938441/