求高手!AOD调用SQL SERVER2005的存储过程,返回的结果集崩溃

wfxyjx 2011-11-26 09:23:18
我做了一个学生信息表,并写了一个存储过程:InsertInfo用来插入记录,可以检测学号重复。如果学号重复则显示1,否则显示0.我在调用这个存储过程后得到一个记录集,通过检测其中的值来判断插入是否成功。

CREATE PROC InsertInfo
@stuno char(10),
@stuname char(10),
@stusex char(10),
@score int
AS
DECLARE @count int
SET @count = 0
SELECT @count = COUNT(*) FROM T_StuInfo WHERE @stuno = F_No

if (@count > 0)
BEGIN
SELECT '1' --显示1,表示学号重复
RETURN
END

INSERT INTO T_StuInfo VALUES(@stuno,@stuname,@stusex,@score)

SELECT '0' --表示成功

我的调用存储过程的代码:
_RecordsetPtr reco; //记录集指针
reco.CreateInstance("ADODB.Recordset");
_ConnectionPtr conn; //连接指针
conn.CreateInstance("ADODB.Connection");

conn->Open((_bstr_t)"Provider=SQLOLEDB;Driver={SQL Server};Server=127.0.0.1,4409;DATABASE=jxgl","sa","adminn",0);
_variant_t affed; //连接数据库
reco = conn->Execute("EXEC InsertInfo '001','李华','男',100",&affed,adCmdText);
//调用存储过程
if (!reco->adoEOF) //此句崩溃
{
//调用GetCollect函数得到0行0号列的值,代码略
}

问题是这样的,如果我插入的学号是重复的,则可以得到正确的“1”。但是如果我插入的学号不重复,在Execute返回的记录集无法做任何操作,包括adoEOF、GetCollect等全都崩溃。不过在此时查看数据库中的表,发现记录已经被插入了,证明存储过程确实已经被调用了。

我曾试过直接用reco->Open(bstrSQL,(IDispatch *)conn,adOpenDynamic,adLockOptimistic,adCmdText);等方法,也是失败。

实在是百思不得其解啊!!跪求高手给解释下……整个程序都被卡这儿了……
...全文
115 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
wfxyjx 2011-11-27
  • 打赏
  • 举报
回复
悲剧,搜了半天,有几个和我同一个问题的,结果没一个能真正解决的。还是一个2003年的帖子了结我的问题。
一句话,在存储过程的开始加上set nocount on
即可
详情:http://topic.csdn.net/t/20031229/16/2614676.html
zyq5945 2011-11-27
  • 打赏
  • 举报
回复
SQLSERVER需要加set nocount on ,不然会返回计数记录集,需要调用_RecordsetPtr::NextRecordset才能定位到你的记录集。
你可以用上面的那个软件试试DataGrid显示,再点击下一个记录集就有了。
wfxyjx 2011-11-26
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 zyq5945 的回复:]

用这个软件试试
[/Quote]
您的这个工具挺不错的,不过对我这个问题貌似没帮助啊
zyq5945 2011-11-26
  • 打赏
  • 举报
回复

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧