我做了一个学生信息表,并写了一个存储过程: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_Noif (@count > 0)
BEGIN
SELECT '1' --显示1,表示学号重复
RETURN
ENDINSERT 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);等方法,也是失败。实在是百思不得其解啊!!跪求高手给解释下……整个程序都被卡这儿了……

解决方案 »

  1.   

    悲剧,搜了半天,有几个和我同一个问题的,结果没一个能真正解决的。还是一个2003年的帖子了结我的问题。
    一句话,在存储过程的开始加上set   nocount   on 
    即可
    详情:http://topic.csdn.net/t/20031229/16/2614676.html
      

  2.   

    SQLSERVER需要加set nocount on  ,不然会返回计数记录集,需要调用_RecordsetPtr::NextRecordset才能定位到你的记录集。
    你可以用上面的那个软件试试DataGrid显示,再点击下一个记录集就有了。