【发布时间】: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