命令参数

在命令文本中参数用问号字符标记。例如,以下 SQL 语句标记了单个输入参数:

{call SalesByCategory('Produce', ?)}

为减少网络流量以提高性能,SQL Server Native Client OLE DB 访问接口不自动获取参数信息,除非在执行命令之前调用了 ICommandWithParameters::GetParameterInfoICommandPrepare::Prepare。也就是说,SQL Server Native Client OLE DB 访问接口不会自动执行以下操作:

  • 验证使用 ICommandWithParameters::SetParameterInfo 指定的数据类型的正确性。

  • 将取值函数绑定信息中指定的 DBTYPE 映射到参数的正确 SQL Server 数据类型。

如果这两个方法指定的数据类型与参数的 SQL Server 数据类型不兼容,那么应用程序在使用该方法时将可能收到错误或产生精度损失。

若要确保不发生这种情况,应用程序应当:

  • 如果硬编码 ICommandWithParameters::SetParameterInfo,则应确保 pwszDataSourceType 与参数的 SQL Server 数据类型匹配。

  • 如果硬编码取值函数,则应确保绑定到参数的 DBTYPE 值与参数的 SQL Server 数据类型具有相同类型。

  • 对应用程序进行编码以调用 ICommandWithParameters::GetParameterInfo,以便访问接口可以动态获取参数的 SQL Server 数据类型。请注意,这会导致与服务器之间额外的网络往返。

注意注意

对于包含 FROM 子句的任意 SQL Server UPDATE 或 DELETE 语句,对于依赖于包含参数的子查询的任意 SQL 语句,对于在比较和类似表达式中包含参数标记或包含限定谓词的 SQL 语句,或其参数之一为函数参数的查询,访问接口不支持调用 ICommandWithParameters::GetParameterInfo。在对 SQL 语句进行批处理时,对于批处理中第一个语句后的语句中的参数标记,访问接口也不支持调用 ICommandWithParameters::GetParameterInfo。在 Transact-SQL 命令中不允许使用注释 (/* */)。

SQL Server Native Client OLE DB 访问接口支持 SQL 语句命令中的输入参数。在过程调用命令中,SQL Server Native Client OLE DB 访问接口支持输入、输出以及输入/输出参数。输出参数值在运行时(仅当没有行集返回时)或当应用程序用尽返回的所有行集时,返回到应用程序。若要确保返回值有效,可使用 IMultipleResults 强制使用行集。

在 DBPARAMBINDINFO 结构中无需指定存储过程参数的名称。pwszName 成员值可使用 NULL,以指示 SQL Server Native Client OLE DB 访问接口应当忽视参数名称,并只使用在 ICommandWithParameters::SetParameterInforgParamOrdinals 成员中指定的序号。如果命令文本中既包含命名参数又包含未命名参数,则必须在所有命名参数之前指定所有未命名参数。

如果指定了存储过程参数的名称,则 SQL Server Native Client OLE DB 访问接口会检查该名称以确保其有效。如果 SQL Server Native Client OLE DB 访问接口从使用者处收到错误的参数名称,则将返回错误。

注意注意

为公开对 SQL Server XML 和用户定义类型 (UDT) 的支持,SQL Server Native Client OLE DB 访问接口实现了新的 ISSCommandWithParameters 接口。

请参阅

概念