C# - SQL Server - ?参数和 Oledb

标签 c# sql-server ado.net parameters oledb

我正在用 C# 编写一个小型框架,用于将数据导入到 SQL Server。

我注意到,如果您尝试使用 ?参数的占位符,如果您使用 System.Data.SqlClient 命名空间,它们将不起作用。

但是,如果您使用 System.Data.OleDb 命名空间来处理数据库,它们就可以正常工作。 (您只需在连接字符串中添加 Provider=SQLOLEDB)

所以我有几个问题,因为 ?我的解决方案需要语法:

  1. 除了在 System.Data.SqlClient 中使用命名参数之外,还有其他选择吗?我想使用有序参数。
  2. 使用一个命名空间(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

出了什么问题?我也尝试添加和删除参数名称中的@符号,但无济于事。

最终编辑:我刚刚让 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/

相关文章:

mysql - 为什么 NHibernate 不支持在 MySql 上进行批处理

c# - ASP NET Core Twitter OAuth 请求 token 问题

c# - 是否可以更改原始数据类型的默认值?

c# - 无法确定条件表达式的类型,因为 'lambda expression' 和 'lambda expression' 之间没有隐式转换

sql-server - 为azure弹性池数据库设置自定义时区

c# - 是否可以在不更改请求 Url 的情况下重新加载页面 Url?

c# - 有什么简单的方法可以使用资源中的图标吗?

php - 使用 FreeTDS 库通过 Zend Framework 连接 MSSQL Server

sql-server - SQL Server 如何使用 NEWID() 创建 uniqueidentifier

c# - 如何在没有连接字符串的情况下获取 SQL Server 名称