查询仅在运行时已知模式的表

时间:2013-04-10 23:43:16

标签: c# windows-8 sqlite sqlite-net

我们正在使用C#创建一个WinStore应用程序,它在SQLite数据库中本地存储一些数据。我们目前正在使用SQLite-net库来访问数据库。数据库中有许多表具有基于客户端数据的动态模式。这些表的模式仅在运行时才知道。

我们无法使用SQLite-net库查询这些动态表。是否可以使用SQLite-net库查询这些表?是否有不同的库可以提供类似的功能?

1 个答案:

答案 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_%,因为该前缀是为系统表保留的。