我正在编写一个用于将数据导入到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