【问题标题】:C# - SQL Server - ? parameters and OledbC# - SQL Server - ?参数和 Oledb
【发布时间】:2009-12-01 19:36:48
【问题描述】:

我正在用 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 使用命名参数。我可以为新的提供者来回更改。

【问题讨论】:

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


    【解决方案1】:

    这就是这些类的行为。 OleDb 使用 ?, SqlClient 命名参数。

    性能:我没有基准测试,但我认为 SqlClient 在 Sql Server 上的性能应该比 OleDB 更好。 SqlClient 对于 Sql Server 是显式的,OleDB 对于任何类型的数据源(甚至 Excel)都是显式的。但是请。试试看。

    使用 SqlClient,您还可以拥有“有序参数”。只需调用参数@Param1、@Param2、@Param3....

    【讨论】:

    • 对于我正在做的一些事情,使用命名参数稍微复杂一些。我最终希望我的框架适用于其他提供程序,例如 Oledb(Excel 或 Access)、MySQL 等。OleDb 是否有命名参数?
    • 我同意以上所有观点(在使用 OLEDB 时,为了清楚起见,我还是使用了命名参数,即使它只是重要的位置)。
    • @Jonathan - 是的,正如我所说,您可以在 OLE DB 中使用命名参数,只是真正重要的是位置
    • @Jonathan:如果您打算使用其他提供程序而不是使用 OleDb 将是简单的方法。另一种方法是抽象您的 DataAccesLayer。如果 SQL 语法不同,这将是必要的。但那是另一回事了。
    【解决方案2】:

    您可以将其用作参数的参考

    SqlCommand.Parameters Property

    【讨论】:

    • 我还是宁愿按索引查找它们,因为按索引提取参数比按字符串值提取参数名称要快。
    • @Jonathan:速度有多快,可维护性的代价是多少,您是否进行了基准测试?
    • 我的框架是为了速度而设计的,在这种情况下,我很乐意牺牲可维护性来换取速度。完成后,除了添加对其他数据库提供程序的支持之外,实际上不需要进行任何更改。
    猜你喜欢
    • 2014-08-08
    • 2011-07-02
    • 2014-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-26
    • 1970-01-01
    • 2017-09-04
    相关资源
    最近更新 更多