【问题标题】:Cursor as an output parameter光标作为输出参数
【发布时间】:2012-09-28 06:14:34
【问题描述】:

我在 SQL Server 2008 R2 中有一个存储过程,它返回一个 Cursor 作为 OUTPUT 值。是否可以将此光标返回到使用 .NET 4.0 框架的 C# 应用程序?

我的存储过程具有以下签名:

CREATE PROCEDURE [dbo].[MyProcedure]
      @nuserid    int,
      @nfetchtype int,
      @returncursor CURSOR VARYING OUTPUT
AS
...

在存储过程结束时我有

...
    set @returncursor = CURSOR FORWARD_ONLY STATIC for SELECT * FROM MyTable WHERE          column=@Value
    open @returncursor
END

在我的 C# Web 应用程序中,我使用了一个利用 System.Data.DbType 的包装器,并将我的返回值/参数设置为 DbType.Object。当我对数据库执行查询时,出现以下错误:

操作数类型冲突:sql_variant 与游标不兼容

这个 DbType.Object 参数适用于 Oracle 中的 REFCURSOR,但我很想知道是否有办法为 SqlServer 做同样的事情。我的目标是在 SqlServer 和 Oracle 中拥有完全相同签名的存储过程。

【问题讨论】:

  • 您可以使用编辑器中的代码选项来格式化您的 SQL 代码吗?另外,这里需要光标吗?它们占用大量资源,通常可以在有限制的情况下完成。
  • 为什么要创建游标?
  • 我想创建一个游标输出值,以便在我的 Oracle 和 SqlServer 存储过程之间拥有相同的签名。使用相同的签名,我可以为每个存储过程使用相同的方法和参数类型。
  • 为什么不使用SqlDataReader 并完全放下光标?
  • 我建议您停止在游标上浪费时间,并重写您的 oracle 存储过程以不使用它们。如果你继续走这条路,你可能会遇到各种各样的问题。

标签: c# sql-server-2008 tsql ado.net cursor


【解决方案1】:

你可以在 SQL 中有一个 CURSOR 参数,但 ADO.NET 不能使用它。相反,在 .NET 中,您必须使用 IDbCommand.ExecuteReader() 返回的 IDataReader,并使用 NextResult() 来迭代您的结果集。

【讨论】:

  • 感谢您的回答,但 SQL Server 允许从存储过程输出 CURSOR 似乎受到限制,但 .NET Framework 无法处理它,尽管它可以处理 Oracle REFCURSOR。跨度>
  • 实际上,当我从 .NET 调用 Oracle SP 时,我使用了 MS 的 System.Data.OracleClient.dll(现已弃用),它也不正确支持 REFCURSOR。我记得当使用超过 1 个 REFCURSOR 参数时,它会产生一些“0 级无效 SQL”的异常。
  • 我没有问题将 Oracle 中的 REFCURSOR 返回到带有来自 System.Data.OracleClient 库的 OracleType.Cursor 对象的输出参数。 .NET 似乎不可能允许来自 Oracle 产品而不是来自 SQL Server 的输出
  • 您使用了哪个客户端 DLL,ODP.NET 还是 System.Data.OracleClient?您尝试通过多少个 REFCURSOR?正如我所说,我有 2 个或更多的问题; 1 对我来说效果很好。
  • 每个程序我只返回了 1 个 REFCURSOR,也没有问题。
【解决方案2】:

您不应该在 OLE DB、ODBC、ADO 和 DB-Library 等数据库 API 中使用游标。

请在使用光标前通过this article

【讨论】:

    猜你喜欢
    • 2015-08-12
    • 2017-01-20
    • 2021-11-23
    • 2013-11-30
    • 2019-02-07
    • 1970-01-01
    • 2013-11-09
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多