2013-04-10 53 views
2

我們正在使用C#創建WinStore應用程序,該應用程序在SQLite數據庫中本地存儲一些數據。我們目前使用SQLite-net庫來訪問數據庫。數據庫中有許多表具有基於客戶端數據的動態模式。這些表的模式只在運行時才知道。查詢模式僅在運行時已知的表格

我們還沒有能夠用SQLite-net庫查詢這些動態表。是否有可能用SQLite-net庫查詢這些表?是否有不同的庫可以提供類似的功能?

回答

1

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中網這種方法:

public List<T> Query<T> (string query, params object[] args) 

*注:我沒有使用SQLite的淨直接構建動態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_%,因爲該前綴保留給系統表。

+0

這是獲取有關表格模式信息的很好的信息。是否可以使用SQLite-net庫來查詢這些僅在運行時已知的表中的一個表? – Scott 2013-04-11 00:14:52

+0

是的 - 您將使用.net包裝來執行上面的查詢。一旦獲得了表的名稱,就可以使用這些名稱動態創建查詢並執行它。 – bryanmac 2013-04-11 00:19:27

+0

但正如文檔所說,sqlite-net不是ado.net驅動程序 - 您必須使用Mono.Data.SQLite或csharp-sqlite。它歸結爲需要執行您動態構建的字符串sql語句。不是sqlite-net的泛型類型方法。 – bryanmac 2013-04-11 00:23:57

相關問題