我正在編寫一個用於將數據導入到SQL Server的C#小框架。C# - SQL Server - ?參數和Oledb
我注意到,如果你嘗試使用?參數的佔位符,如果使用System.Data.SqlClient命名空間,則它們不起作用。
但是,如果使用System.Data.OleDb命名空間來處理數據庫,則它們工作得很好。 (你只需要在你的連接字符串中添加Provider = SQLOLEDB)
所以我有幾個問題,因爲?語法是我的解決方案所需:
- 是否有替代使用命名參數與System.Data.SqlClient?我想使用有序的參數。
- 使用一個名稱空間(ado提供程序)對另一個名稱空間(ado提供程序)有任何性能影響嗎?
- 是否有其他原因,我應該更喜歡一個命名空間而不是另一個?
要闡述什麼,我試圖做的,我的框架是要採取飾有一些自定義屬性的類,並生成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使用命名參數。我可以來回更換新的提供者。
對於我正在做的一些事情,使用命名參數稍微複雜一些。我最終希望我的框架能夠爲Oledb(Excel或Access),MySQL等其他提供者工作。OleDb是否有命名參數? – jonathanpeppers 2009-12-01 19:51:28
我同意上述所有內容(並且在使用OLEDB時,爲了清晰起見,我仍然使用命名參數,儘管它只有重要的位置)。 – Murph 2009-12-01 19:58:56
@Jonathan - 是的,正如我所說的,你可以在OLE DB中使用命名參數,它只是實際上唯一重要的是位置 – Murph 2009-12-01 20:00:59