光标作为输出参数

时间:2012-06-14 14:13:28

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

我在SQL Server 2008 R2中有一个存储过程,它返回一个Cursor作为OUTPUT值。是否可以使用.NET 4.0框架将此Cursor返回到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中存储具有完全相同签名的存储过程。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

在使用光标之前请先浏览this article