vc6.0操作sql server 2000数据库。那位高手熟悉_RecordsetPtr指针操作,帮小弟看看下面的代码吧,能够实现我要的向TwoConditionSet表中插入数据,但是结束后就出现   Runtime error!
   this application has requested the runtime to terminate it in an unusual way.
   please contact the application's support team for more information.
 的错误。
是因为结束后没有对指针处理导致的吗???  求指点!!!void Createtwice()
{ ADOConn ado;
         int countnumber=0;
int circletime=0;
CString strsql="select * from OneConditionSet where oncehouse=1";
    _bstr_t bstrsql(strsql);    _variant_t varconditionstr1;
    _variant_t varconditionstr2;
    _variant_t varcondition1;
    _variant_t varcondition2;
    _variant_t varhouse;
    _variant_t varhousespt; _RecordsetPtr m_pRecordset1=ado.GetRecordSet(bstrsql);
    _RecordsetPtr m_pRecordset2;    varconditionstr1=m_pRecordset1->GetCollect("oncecondit");
    conditionstr1=(char *)_bstr_t(varconditionstr1); varcondition1=m_pRecordset1->GetCollect("onceeducat");
    condition1=(char *)_bstr_t(varcondition1); while(!m_pRecordset1->adoBOF)
{
         for(int j=0;j<circletime;j++)
      m_pRecordset1->MoveNext();
 if(circletime==0)
             m_pRecordset1->MoveNext();  if(circletime!=0)
 {
              varconditionstr1=m_pRecordset1->GetCollect("oncecondit");
              conditionstr1=(char *)_bstr_t(varconditionstr1);       varcondition1=m_pRecordset1->GetCollect("onceeducat");
      condition1=(char *)_bstr_t(varcondition1);
  m_pRecordset1->MoveNext();
 }        
         m_pRecordset2=m_pRecordset1;  while(!m_pRecordset2->adoEOF)
 {
 varconditionstr2=m_pRecordset2->GetCollect("oncecondit");
 conditionstr2=(char *)_bstr_t(varconditionstr2);  varcondition2=m_pRecordset2->GetCollect("onceeducat");
 condition2=(char *)_bstr_t(varcondition2);  if(conditionstr1!=conditionstr2)
 {
 countnumber++;
 CString string="insert into TwoConditionSet(twiceid,twiceconditstr1,twicecondit1,twiceconditstr2,twicecondit2,";
 string+="twicecondit12spt,twicehouse,twicehousespt)values(%d,'%s','%s','%s','%s',%d,%d,%d)";
 CString str;
 str.Format(string,countnumber,conditionstr1,condition1,conditionstr2,condition2,conditionspt,house,housespt);
 _bstr_t bstrsql1(str);
 ado.ExecuteSQL(bstrsql1);
 }
 m_pRecordset2->MoveNext();  }
 circletime++;
 m_pRecordset1->MoveFirst();
}
 
}

解决方案 »

  1.   

    看不出来,把ADOConn的代码也贴出来看看。
      

  2.   

    ADOConn.cpp代码:
    #include "StdAfx.h"
    #include "HouseSaleSystem.h"
    #include "ADOConn.h"#ifdef _DEBUG
    #undef THIS_FILE
    static char THIS_FILE[]=__FILE__;
    #define new DEBUG_NEW
    #endif//////////////////////////////////////////////////////////////////////
    // Construction/Destruction
    //////////////////////////////////////////////////////////////////////ADOConn::ADOConn()
    {}ADOConn::~ADOConn()
    {}// 初始化—连接数据库void ADOConn::OnInitADOConn(){     // 初始化OLE/COM库环境     ::CoInitialize(NULL);     try  {// 创建Connection对象          m_pConnection.CreateInstance("ADODB.Connection");// 设置连接字符串,必须是BSTR型或者_bstr_t类型          _bstr_t strConnect = "Provider=SQLOLEDB; Server=.;Database=mydata; uid=sa; pwd=;";           m_pConnection->Open(strConnect,"","",adModeUnknown);  }// 捕捉异常    catch(_com_error e) {// 显示错误信息         AfxMessageBox(e.Description()); }}// 执行查询_RecordsetPtr& ADOConn::GetRecordSet(_bstr_t bstrSQL){    try {// 连接数据库,如果Connection对象为空,则重新连接数据库         if(m_pConnection==NULL)         OnInitADOConn();// 创建记录集对象         m_pRecordset.CreateInstance(__uuidof(Recordset));  m_pRecordset->CursorLocation=adUseClient;   //游标的位置出现.不加这句会出现The rowset is not //bookable运行错误// 取得表中的记录         m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText); }// 捕捉异常    catch(_com_error e) {// 显示错误信息        AfxMessageBox(e.Description()); }// 返回记录集     return m_pRecordset;}// 执行SQL语句,Insert Update _variant_tBOOL ADOConn::ExecuteSQL(_bstr_t bstrSQL){// _variant_t RecordsAffected;    try {// 是否已经连接数据库        if(m_pConnection == NULL)        OnInitADOConn();// Connection对象的Execute方法:(_bstr_t CommandText,// VARIANT * RecordsAffected, long Options )// 其中CommandText是命令字串,通常是SQL命令。// 参数RecordsAffected是操作完成后所影响的行数,// 参数Options表示CommandText的类型:adCmdText-文本命令;adCmdTable-表名// adCmdProc-存储过程;adCmdUnknown-未知        m_pConnection->Execute(bstrSQL,NULL,adCmdText);     return true; }    catch(_com_error e) {         AfxMessageBox(e.Description());         return false; }}
    int ADOConn::GetRecordSetCount(_RecordsetPtr m_pRecordset)
    {
    int count=0;
    try
    {
    m_pRecordset->MoveFirst();
    }
    catch(...)
    {
    return 0;
    }
    if(m_pRecordset->adoEOF)
    return 0;
    while(!m_pRecordset->adoEOF)
    {
    m_pRecordset->MoveNext();
    count=count+1;
    }
    m_pRecordset->MoveFirst();
    return count;
    }
    void ADOConn::ExitConnect(){// 关闭记录集和连接    if (m_pRecordset != NULL)        m_pRecordset->Close();        m_pConnection->Close();        ::CoUninitialize();}
      

  3.   

    嗯,m_pConnection.CreateInstance没有对应的 m_pConnection.Release,加上试试。RecordSet也要如此对应才行。