2011-12-17 111 views
4

我有我們在ADO.NET中編寫的C#應用​​程序。我一直在使用IDbCommandIDbConnection接口來創建交叉數據庫代碼。 (到Firebird,SQLite,SQL Server 2005和2008,Access 2007,以及Access 2010和Oracle 11g),這一切都奏效了。參數分隔符

問題我有,我現在有一個我需要支持的Oracle 10g數據庫。

所有「正常」的東西,創建連接,並命令工作正常,但是,當我去使用接口IDataParametercmd.CreateParamater()萬兆無法創建一個參數,因爲在查詢參數語法(我使用參數化查詢)。

顯然,Oracle 10g開箱即用,不支持使用@標誌。 Oracle 11g,SQL Server以及其他所有提到的功能。

例如,下面的查詢將在10g中失敗:

select * from Products where ProductId = @ProductId 

但是,如果我用冒號,它成功就好,使用上述ado.net接口,所以這個查詢會成功:

select * from Products where ProductId = :ProductId 

不幸的是,冒號在大多數其他數據庫實現中不起作用。

或者是否有一個選項可以在Oracle 10g數據庫中翻轉,允許使用@分隔符代替參數的:分隔符。

目前的解決方案我已經是不太理想,我有顧客/客戶端初始化屬性ParameterDelimiter(我默認爲@號),並使用string.Format,插入ParameterDelimiter

是否有任何標準的方法來做到這一點,我錯過了,沒有客戶必須傳遞一個分隔符,或者沒有我的基礎庫知道數據庫實現? (例如,包括ODP.NET和檢查針對OracleConnection

+0

這是你在應用程序中嵌入的SQL文本嗎?(「select * from ...」 – 2011-12-17 15:42:43

+0

是的,我正在使用參數化查詢,我正在生成參數,並用它們傳入的值替換它們。 – 2011-12-17 15:49:17

+0

您可能需要檢查連接的類型,如果你要抽象數據庫類,我會建議創建一個查詢生成類,通過一個抽象類來訪問,就像你在創建IDbConnection時創建的一個接口一樣...... – 2011-12-17 15:55:19

回答

7

對於它的價值,我也發現這個帖子:

Which parameter marker should I use? ADO.NET 2.0, Sql Server @, Oracle :(鏈接是死的)

在這個問題提到:

Get the parameter prefix in ADO.NET

用下面的代碼「問」的連接對象的信息:

string format = connection 
    .GetSchema("DataSourceInformation") 
    .Rows[0]["ParameterMarkerFormat"] 
    .ToString(); 

因此,這應該是'這樣做的標準方式',也不需要客戶傳遞信息,也不必知道數據庫實現。

編輯:必須添加System.Data.SqlClient.SqlConnection顯然返回{0}而不是@{0}

+0

絕對美麗! – 2011-12-17 16:40:38

+0

借調 - 我的+1! – dash 2011-12-17 16:42:15

+0

嘿嘿,不知道我同意'美麗',但如果它解決了你的問題,那太棒了! – 2011-12-17 16:42:35