2012-02-21 78 views
1

是否有可能在SQL Server中使用與Oracle相同的表示法表示綁定變量,即:0,:1而不是使用?。綁定變量選項

我已經搜索,但沒有發現任何確鑿的事情。目前,我的解決方案使用綁定變量爲我在Oracle中運行良好的數據庫上運行的語句引入值,但我還需要在SQL Server和PostGIS中執行相同的操作。我不希望有說,例如:

switch(dialect) 
{ 
    case "Oracle": 
    { 
     oleDataBaseConnection.AddParameter(":1", coordsys); 
     break; 
    } 

    case "SQLServer": 
    { 
     oleDataBaseConnection.AddParameter("?", coordsys); 
     break; 
    } 
} 

* AddParameter()是我的包裝類,調用執行功能我已經寫了當值添加到列表添加到命令對象的功能。

我希望我的代碼儘可能乾淨,並且不包含如上所示的硬編碼內容。我想要一個適合所有人的解決方案。 (是的,我知道這可能是一廂情願的想法!)

我知道我可以使用字符串替換來做到這一點,但它不是我所追求的。我不想使用這樣的解決方法。另外我的項目經理要求我嘗試使用綁定變量來尋找解決方案。

任何想法?

回答

1

簡短的回答是否定的,綁定變量在不同的數據庫中以不同的方式實現。所以你需要一些凌亂的兼容邏輯。

這就是說,我個人已經在過去使用字符串替換爲綁定參數提供正確的語法來解決此問題。因此,您可以在您的代碼中嵌入:coordsys到您的SQL語句中,然後嵌入oleDataBaseConnection.AddParameter("coordsys", coordsys);。然後,您的準備語句將搜索SQL,找到:coordsys並將其替換爲您需要的任何內容(例如?),並根據名稱爲後續執行構建參數列表。當您執行時,您可以即時創建要使用的綁定參數的正確列表。

實現幕後位有點棘手,但我個人發現它帶來了乾淨的SQL,具有綁定參數的好處(如數據庫性能,來自SQL注入攻擊的安全性)。

+0

我想我明白你的意思。所以基本上,當我將參數添加到命令時,字符替換將由我的包裝類處理。所以我會簡單地檢測我現在所需要的方言,並將它放在正確的語法中。或者:。一個問題是我的一個數據庫可能根本不支持綁定變量。我猜在這種情況下,我將不得不在我的代碼中進行字符串替換,但我必須事先知道它不支持綁定變量。這真的是一個相當棘手的任務。 – CSharpened 2012-02-21 16:43:57

+0

@C精確。然而在這一點上,我希望所有體面的數據庫驅動程序都以某種方式支持綁定變量,因爲這對於避免SQL注入攻擊非常重要。 – btilly 2012-02-21 16:56:37

+0

好的謝謝你的信息。我會看看我能否成功實施你的建議。這似乎是我需要和想到的,但我希望可能有一個稍微優雅的解決方案。謝謝。 – CSharpened 2012-02-21 16:59:19