2009-05-18 69 views
1

我正在使用2.0框架,並且正在尋找一種通用方法來確定列中是否存在列。我想用這個代碼與多個數據庫類型和提供者。確定列中是否存在ADO.NET的通用方法

GetSchema方法將返回模式信息,但信息的格式和限制返回信息的數據似乎是特定於提供者的。

我見過的其他解決方案似乎歸結爲Select * from table,然後搜索結果以查看該列是否存在。這將工作,但似乎很瘋狂發出整個表的選擇,以查看是否存在一列。

回答

3

兩個選項,我能想到的時候了:

這將是不錯的使用是SQL標準的一部分,INFORMATION_SCHEMA視圖,但不是所有的數據庫系統執行。但是,如果你關心的一組數據庫能夠實現它,這是你的最佳選擇。

另一個選擇是接受您的查詢,但在其上添加一個「WHERE 1 = 0」子句,以便它不返回任何行。在這種情況下,ADO.NET仍然會返回模式

編輯:實際上,第二種方法會給你列和它們的數據類型的存在。然而,我不確定你會得到完整的模式信息,如最大長度,NULLable等。INFORMATION_SCHEMA視圖確實是最好的選擇,但是ORACLE並沒有實現它們。

我沒碰到過這樣的:

http://database-geek.com/2009/04/30/oracle-information_schema/

這是一個開源的努力來模仿Oracle中的INFORMATION_SCHEMA的意見。我不知道在這一點上這種努力有多完整或功能如何。

+0

在這種情況下,我不需要完整的模式信息。我只是試圖實現一個通用的bool FieldExists(string tableName)方法。 – 2009-05-18 17:12:07

+0

我喜歡試圖向管理層解釋SQL標準如何不是一個真正的標準,因爲如此多的實現不同或者根本不在不同的數據庫中實現。 – 2009-05-18 17:22:34

+0

這就是爲什麼我對該項目感興趣以在Oracle上實現INFORMATION_SCHEMA的原因。甲骨文在這裏是一個很大的例外,但它確實不應該很難實現。 Oracle提供所有這些信息,只是在一組自定義的表/視圖中。這真的只是一些人花時間來真正構建視圖以將數據轉換爲正確的模式 – Clyde 2009-05-18 17:48:45

2

而不是SELECT * FROM表,你可以這樣做:

select * from table 
where true=false 

這將讓ADO看到列的名稱,而不返回任何數據。可能有更好的通用方法來查詢DB提供者之間的系統表,但我不知道它。

+0

這個解決方案就是我實際實現的。我將克萊德的解決方案標記爲公認的解決方案,因爲他提到了這個解決方案,而INFORMATION_SCHEMA對某些解決方案可能更好。 – 2009-05-20 12:56:34

相關問題