2015-04-17 169 views
0

我有一個龐大的程序,已經有大量的查詢參數。C#SqlCommand和非命名參數

在整個項目中,我只有通過的IDbConnection,IDbCommand的訪問到數據庫等接口而不是直接使用的OleDbConnection,OleDbCommand的,等

這允許我使用不同的數據庫引擎和連接類型與我的應用程序。直到現在,例如,我使用OleDbConnection連接到MS SQL Server數據庫,OdbcConnection for MySql和SQLiteConnection從外部庫,顯然,SQLite。

現在我想嘗試用SqlConnection替換OleDbConnection來連接到SQL Server,但是我發現參數化查詢存在一些問題。

我是用來做這樣的事情與參數化查詢:

IDbCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "UPDATE foo SET field1=? WHERE ID=?"; 
DbUtils.AddParameter(cmd, DbType.StringFixedLength, "hello"); 
DbUtils.AddParameter(cmd, DbType.Int32, 1); 
cmd.ExecuteNonQuery(); 

的AddParameter靜態方法檢查IDbCommand的類型和參數值添加到它。

這適用於上面指定的三種連接類型,但不適用於SqlConnection,它會引發錯誤:'?'附近的語法錯誤。

的SqlCommand似乎需要命名參數的工作:

IDbCommand cmd = connection.CreateCommand(); 
cmd.CommandText = "UPDATE foo SET [email protected] WHERE [email protected]"; 
DbUtils.AddParameter(cmd, DbType.StringFixedLength, "@pfield1", "hello"); 
DbUtils.AddParameter(cmd, DbType.Int32, "@pID", 1); 
cmd.ExecuteNonQuery(); 

你知道,如果它是不可能性,以避免使用命名參數,以保持與其他連接類型的兼容性?

謝謝!

Francesco

+0

您是否嘗試過只用'@',而不是'?'? – krillgar

+0

@krillgar:我只是試過,但它給了我錯誤:**必須聲明可擴展的變量'@'** – Formentz

+0

這就是我想它會做的,但值得一試。 – krillgar

回答

3

我不這麼認爲。

SqlCommand.Parameters property

The Microsoft .NET Framework Data Provider for SQL Server does not support the question mark (?) placeholder for passing parameters to a SQL Statement or a stored procedure called by a command of CommandType.Text. In this case, named parameters must be used.

+0

謝謝,我沒有在文檔中找到該評論...似乎我必須繼續使用OleDbProvider – Formentz

+0

@Formentz Glad幫助。您應該始終使用您當然需要的正確提供商;) –