2009-12-01 75 views
2

我正在編寫一個用於將數據導入到SQL Server的C#小框架。C# - SQL Server - ?參數和Oledb

我注意到,如果你嘗試使用?參數的佔位符,如果使用System.Data.SqlClient命名空間,則它們不起作用。

但是,如果使用System.Data.OleDb命名空間來處理數據庫,則它們工作得很好。 (你只需要在你的連接字符串中添加Provider = SQLOLEDB)

所以我有幾個問題,因爲?語法是我的解決方案所需:

  1. 是否有替代使用命名參數與System.Data.SqlClient?我想使用有序的參數。
  2. 使用一個名稱空間(ado提供程序)對另一個名稱空間(ado提供程序)有任何性能影響嗎?
  3. 是否有其他原因,我應該更喜歡一個命名空間而不是另一個?

要闡述什麼,我試圖做的,我的框架是要採取飾有一些自定義屬性的類,並生成SQL像這樣:

INSERT INTO myTable (col1, col2, ...) VALUES (?, ?, ...) 

此字符串將與一個被創建IDbCommand和幾個IDataParameters,並且對於每個ExecuteNonQuery,它只會設置IDataParameters上的值。

有什麼想法?

編輯:我嘗試使用命名參數作爲p0,p1等作爲回答者提到,它在SqlClient上工作得很好。但是,如果我使用OLEDB,它錯誤說:

"Must declare the scalar variable @p0." 

我的參數,像這樣創建:

new OleDbParameter("p" + index, GetType(attribute)); 
//GetType does work to get the correct SqlDbType 

有什麼不對?我也嘗試添加和刪除參數名稱中的@符號無濟於事。

FINAL EDIT:我只是讓Oledb使用?和SqlClient使用命名參數。我可以來回更換新的提供者。

回答

5

這就是那些類的行爲。 OleDb使用?,SqlClient命名參數。

性能:我沒有基準,但我認爲SqlClient應該比Sql Server的性能要好於OleDB。對於任何種類的數據源(甚至是Excel),SqlClient都是Sql Server和OleDB顯式的。但是,請。試試看。

使用SqlClient,您也可以擁有「有序參數」。給你參數@Param1,@Param2,@Param3 ....

+0

對於我正在做的一些事情,使用命名參數稍微複雜一些。我最終希望我的框架能夠爲Oledb(Excel或Access),MySQL等其他提供者工作。OleDb是否有命名參數? – jonathanpeppers 2009-12-01 19:51:28

+0

我同意上述所有內容(並且在使用OLEDB時,爲了清晰起見,我仍然使用命名參數,儘管它只有重要的位置)。 – Murph 2009-12-01 19:58:56

+0

@Jonathan - 是的,正如我所說的,你可以在OLE DB中使用命名參數,它只是實際上唯一重要的是位置 – Murph 2009-12-01 20:00:59

0

您可以以此爲參考對PARAMS

SqlCommand.Parameters Property

+0

我還是寧願用索引來查找它們,因爲索引拉出參數比字符串值的名稱要快。 – jonathanpeppers 2009-12-01 19:52:43

+1

@Jonathan:多快多快,犧牲可維護性,你有基準嗎? – gbn 2009-12-01 20:16:00

+0

我的框架是爲了速度,我很樂意在這種情況下犧牲速度的可維護性。完成後,除了增加對其他數據庫提供者的支持外,不需要進行任何更改。 – jonathanpeppers 2009-12-01 20:21:56