2009-07-16 25 views
0

我想允許用戶定義一個將被用來獲取一些信息的查詢。用戶連接到的數據庫也是用戶可定義的。基本上,用戶需要執行的步驟是:如何使用DbConnection.GetSchema以不可知的方式確定數據庫列類型?

1 /選擇數據提供者(這是由DbProviderFactories.GetFactoryClasses()返回的提供者之一)

2 /通過在填充配置所選提供者屬性網格綁定到由選定的DbProviderFactory返回的DbConnectionStringBuilder。

3 /選擇一個查詢將操作的表。表的列表來自DbConnection.GetSchema(「表」)(其中DbConnection來自所選的DbProviderFactory)

4 /選擇包含查詢所需數據的列(需要2列)。其中一列必須是文本或整數,另一列必須是數字。

我已經能夠成功地完成前3個步驟,但在步驟4中遇到了問題。最初我連接到了sql server數據庫並使所有工作都正常。現在我已經用oracle XE數據庫嘗試過了,我似乎遇到了問題。

使用的SQLServer2005的數據庫,當我查詢從架構我得到這樣的信息DATA_TYPES:

Type name  ProviderDbType DataType 

nchar   10    System.String 
int   8    System.Int32 

,當我再查詢我的表列的模式,我得到:

Column_Name  Data_Type 
Id    nchar 
Length   int 

因此,當試圖將列類型(通過Data_type列值)映射到從DATA_TYPES架構表中鍵入Type_name的系統類型I時。這一切都很好。

然後,我開始使用Oracle(通過ODBC雖然DATA_TYPES信息似乎正是我從柱子後面的查詢是不同的同我得到的是這樣的:。

Column_Name  Data_Type Type_Name 
Id     8   VARCHAR2 
Length    10   int 

所以我以前的從DATA_TYPES模式表中鍵入Type_Name並查找Data_Type的值以獲取系統類型的策略不起作用,因爲它使用鍵nchar存儲系統類型,然後嘗試用鍵8查找它。

查看模式中可用的各種東西我看不出我是如何知道列q中的哪一列uery映射到DATA_TYPES模式表中的哪一列。

對於長期問題的道歉,希望問題清楚。

回答

1

最好的辦法來編寫應用程序級別包含特定的代碼來解釋每一個數據庫,然後返回一個共同的格式

+0

我認爲,該模型應該阻止你做了嗎?我可以確定使用Odbc連接,無論odbc連接設置爲使用哪個驅動程序,這種新格式都將保持一致嗎?如果不是,那麼如果他們選擇了一些我沒有寫出特定代碼的odbc驅動程序會發生什麼? – 2009-07-16 13:40:43

1

你不應該要求用戶選擇一個供應商的包裝功能。讓用戶選擇數據庫並讓應用程序確定要使用哪個提供程序。

如果您使用OLE DB提供程序,是否可以使用OleDbType Enumeration

有一個爲Oracle提供的內置.NET和native OLE DB提供程序。

又見Data Type Mappings in ADO.NET

相關問題