我们正在使用C#创建一个WinStore应用程序,它在SQLite数据库中本地存储一些数据。我们目前正在使用SQLite-net库来访问数据库。数据库中有许多表具有基于客户端数据的动态模式。这些表的模式仅在运行时才知道。
我们无法使用SQLite-net库查询这些动态表。是否可以使用SQLite-net库查询这些表?是否有不同的库可以提供类似的功能?
答案 0 :(得分:1)
sqlite_master表包含有关数据库中对象的元数据,例如表。您可以像查询任何其他表一样查询该表。请注意,它是一个系统表,您无法直接操作,并且在创建数据库对象时创建/更新它。
查询表后,您必须根据该元数据动态构建查询以查询动态架构。
这是另一个SO帖子,包括查询表:How to list the tables in an SQLite database file that was opened with ATTACH?
sqlite docs中也对此进行了讨论:http://www.sqlite.org/sqlite.html
参见“Aside:查询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_%,因为该前缀是为系统表保留的。