我正在用 C# 编写一个小型框架,用于将数据导入到 SQL Server。
我注意到,如果您尝试使用 ?参数的占位符,如果您使用 System.Data.SqlClient 命名空间,它们将不起作用。
但是,如果您使用 System.Data.OleDb 命名空间来处理数据库,它们就可以正常工作。 (您只需在连接字符串中添加 Provider=SQLOLEDB)
所以我有几个问题,因为 ?我的解决方案需要语法:
- 除了在 System.Data.SqlClient 中使用命名参数之外,还有其他选择吗?我想使用有序参数。
- 使用一个命名空间(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
出了什么问题?我也尝试添加和删除参数名称中的@符号,但无济于事。
最终编辑:我刚刚让 Oledb 使用?和 SqlClient 使用命名参数。我可以来回更改新的提供商。
最佳答案
这就是这些类的行为。 OleDb 使用 ?, SqlClient 命名参数。
性能:我没有基准测试,但我认为 SqlClient 在 Sql Server 上的性能应该比 OleDB 更好。 SqlClient 对于 Sql Server 是显式的,OleDB 对于任何类型的数据源(甚至是 Excel)都是显式的。但请。试试看。
使用 SqlClient,您还可以拥有“有序参数”。只需调用参数@Param1、@Param2、@Param3...
关于C# - SQL Server - ?参数和 Oledb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1828368/