2009-12-01 72 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