日期:2014-05-16  浏览次数:20434 次

ado执行存储过程中包含结果集获取输出参数为VT_EMPTY

ado执行存储过程,如果存储过程中包含结果集返回和输出参数,会导致获取输出参数为VT_EMPTY。目前没有找到对应的原因,网上有提相关问题但是也没人解决。有哪位大侠知道原因的请留个言,也为其他开发人员提供一个解决思路。

我目前的解决方法只能针对我遇到的情况。因为我使用的存储过程的返回结果集是中间结果集,不需要使用到,因此只要把返回结果集给去掉就行。不返回结果集的方法是在存储过程中加入SET NOCOUNT ON。

SET NOCOUNT
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。

语法
SET NOCOUNT { ON | OFF }

注释
当 SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。当 SET NOCOUNT 为 OFF 时,返回计数。

即使当 SET NOCOUNT 为 ON 时,也更新 @@ROWCOUNT 函数。

当 SET NOCOUNT 为 ON 时,将不给客户端发送存储过程中的每个语句的 DONE_IN_PROC 信息。当使用 Microsoft? SQL Server? 提供的实用工具执行查询时,在 Transact-SQL 语句(如 SELECT、INSERT、UPDATE 和 DELETE)结束时将不会在查询结果中显示"nn rows affected"。

如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。

6楼imlmy35分钟前
找到原因了,ado真tmd恶心,必须先关闭结果集,才能获取输出参数。http://blog.csdn.net/handsomerun/article/details/1714598
5楼imlmy2小时前
adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法nnadLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。nnadLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。nnadLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、删、改的操作。
4楼imlmy2小时前
adModeUnknown:缺省。当前的许可权未设置nnadModeRead:只读nnadModeWrite:只写nnadModeReadWrite:可以读写nnadModeShareDenyRead:阻止其它Connection对象以读权限打开连接nnadModeShareDenyWrite:阻止其它Connection对象以写权限打开连接nnadModeShareExclusive:阻止其它Connection对象以读写权限打开连接nnadModeShareDenyNone:阻止其它Connection对象以任何权限打开连接
3楼imlmy2小时前
enum CursorTypeEnumn{nadOpenUnspecified = -1,///不作特别指定nadOpenForwardOnly = 0,///前滚静态光标。这种光标只能向前浏览记录集,比如用MoveNext向前滚动,这种方式可以提高浏览速度。但诸如BookMark,RecordCount,AbsolutePosition,AbsolutePage都不能使用nadOpenKeyset = 1,///采用这种光标的记录集看不到其它用户的新增、删除操作,但对于更新原有记录的操作对你是可见的。nadOpenDynamic = 2,///动态光标。所有数据库的操作都会立即在各用户记录集上反应出来。nadOpenStatic = 3///静态光标。它为你的记录集产生一个静态备份,但其它用户的新增、删除、更新操作对你的记录集来说是不可见的。n};
2楼imlmy昨天 18:22
看来不能这样回避这个问题,需要再想想看怎么解决
1楼imlmy昨天 18:12
adUseClient 3 使用本地游标库提供的客户端的游标。本地游标服务通常允许执行驱动程序提供的游标所不允许的许多功能,因此使用此设置可以充分利用即将启用的功能。为进行向后兼容,亦支持同义字 adUseClientBatch。 nadUseNone 1 不使用游标服务。(此常量已作废并且只是为了向后兼容才出现。) nadUseServer 2 默认值。使用数据提供者或驱动程序提供的游标。这些游标有时很灵活,可以额外感知其他人对数据源所做的更改。但是,Microsoft Cursor Service for OLE DB 的某些功能(例如断开 Recordset 对象)不能用服务器端游标模拟,这些功能在此设置中将不可用。