命令参数

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

{call SalesByCategory('Produce', ?)}  

为了通过减少网络流量来提高性能,除非在执行命令之前调用 ICommandWithParameters::GetParameterInfoICommandPrepare::P repare ,否则 SQL Server Native Client OLE DB 提供程序不会自动派生参数信息。 这意味着 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 语句调用 ICommandWithParameters::GetParameterInfo ;对于任何 SQL 语句,具体取决于包含参数的子查询;对于包含比较表达式中的参数标记的 SQL 语句,例如或限定谓词;或查询其中一个参数是函数的参数。 处理一批 SQL 语句时,提供程序也不支持在批处理中的第一个语句之后调用 ICommandWithParameters::GetParameterInfo 作为参数标记。 Transact-SQL 命令中不允许注释(/* */)。

SQL Server Native Client OLE DB 提供程序支持 SQL 语句命令中的输入参数。 在过程调用命令上,SQL Server Native Client OLE DB 提供程序支持输入、输出和输入/输出参数。 输出参数值在执行时(仅当未返回行集时)或应用程序耗尽所有返回的行集时,都会返回到应用程序。 若要确保返回的值有效,请使用 IMultipleResults 强制使用行集。

不需要在 DBPARAMBINDINFO 结构中指定存储过程参数的名称。 将 NULL 用于 pwszName 成员的值,以指示 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 接口。

另请参阅

命令