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

标签 c# windows-8 sqlite sqlite-net

我们正在使用 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/

相关文章:

objective-c - 当我获取数据时,始终仅从sqlite数据库中获取First值

c# - VSIX IClassifier 分配多个 ClassificationTypes

iphone - iPhone 上的 SQLite3 - 插入返回错误代码 8 尝试写入只读数据库

python - 使用Python将图像下载到sqlite数据库

Python: webbrowser.open ("") 打开文件资源管理器窗口

javascript - 无法在 .js 文件中命中断点

c# - 循环显示 5 个图像的动态图 block

c# - 通过 GUI 访问 Windows 服务的最佳方式

c# - VS 2010 C# 注释任务在后面的注释中不出现

c# - 在 C# 中隐藏另一个应用程序的系统托盘