解决方案 »

  1.   

    //打开查询记录
    _RecordsetPtr OPenRecordSet(_RecordsetPtr m_pRecordset,CString  strsql)
    {
    bstr_t bstrSQL=strsql; 

    m_pRecordset.CreateInstance(__uuidof(Recordset));  
        //打开记录集  
    m_pRecordset->CursorType = adOpenStatic;
    m_pRecordset->CursorLocation = adUseClient;
    if ( m_pRecordset->State )// 如果记录集打开的话,把它关了
    m_pRecordset->Close();

        m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenStatic, adLockOptimistic,adCmdText);   return m_pRecordset;
    }//获取想要的数据列
    int GetColectEx(_RecordsetPtr m_pRecordset,char * Retvar,int index)
    {
    if(index<0)
    return -1; _variant_t var;
    var= m_pRecordset->GetCollect(_variant_t((long)index));        ///在这里经常异常
    if(var.vt != VT_NULL)   
    strcpy(Retvar,(char*)(_bstr_t)var);
    else
    strcpy(Retvar, " ");
    return 1;
    }/////调用查询和获取数据
    try
    {
    m_pRecordset=OPenRecordSet(m_pRecordset,strsql); char temp[50]={0};
    GetColectEx( m_pRecordset,temp,0);
    iNum=atoi((char*)_bstr_t(temp));

    CloseRecordSet();
    }
    catch(_com_error e)
    {
    e.Description();
    return false;
    }
      

  2.   


     EnterCriticalSection(&m_crit_db_Exec_section);    
    try    {        m_db.ExecuteSQL(strSql);    }    
    catch(CDBException* e)    {        char error[128] = {0};        e->GetErrorMessage(error,128,NULL);        error[strlen(error)-2] = 0;        TRACE("Insert GetErrorMessage: %s\n",error);                 return FALSE;    }    LeaveCriticalSection(&m_crit_db_Exec_section); 
    这个代码。出现异常,直接就死锁了
      

  3.   

    GetCollect 也用try catch捕获一下
      

  4.   

    //打开查询记录
    _RecordsetPtr OPenRecordSet(_RecordsetPtr m_pRecordset,CString  strsql)
    //很诡异的定义方式,既然m_pRecordset既然是在函数体中创建,和调用者没有啥关系,虽然也没有什么错,干嘛要让调用者多传递一个参数?
    {
    bstr_t bstrSQL=strsql; 

    m_pRecordset.CreateInstance(__uuidof(Recordset));      //打开记录集  
    m_pRecordset->CursorType = adOpenStatic;
    m_pRecordset->CursorLocation = adUseClient;
    if ( m_pRecordset->State )// 如果记录集打开的话,把它关了
    m_pRecordset->Close();
    //既然是CreateInstance新建的,此if是多余的,肯定不会是open的    m_pRecordset->Open(bstrSQL,m_pConnection.GetInterfacePtr(),adOpenStatic, adLockOptimistic,adCmdText);   return m_pRecordset;
    }//获取想要的数据列
    int GetColectEx(_RecordsetPtr m_pRecordset,char * Retvar,int index)
    {
    if(index<0)
    return -1; _variant_t var;
    var= m_pRecordset->GetCollect(_variant_t((long)index));        ///在这里经常异常 //此有异常,估计你的index值有问题 if(var.vt != VT_NULL)   
    strcpy(Retvar,(char*)(_bstr_t)var);
    //此处应该有问题,不管什么值类型,都做字串拷贝?又是一个很怪异的取值方法
    else
    strcpy(Retvar, " ");
    return 1;
    }/////调用查询和获取数据
    try
    {
    m_pRecordset=OPenRecordSet(m_pRecordset,strsql); char temp[50]={0};
    GetColectEx( m_pRecordset,temp,0);
    iNum=atoi((char*)_bstr_t(temp));

    CloseRecordSet();
    }
    catch(_com_error e)//此处应该有问题,反正我是&e 的,并且能很好的捕捉到错误
    {
    e.Description();//这个要干嘛?
    return false;
    }
      

  5.   

    GetCollect 也用try catch捕获一下  这里try也不能返回错误消息,也直接是崩溃了。
      

  6.   

    to worldy:
    var= m_pRecordset->GetCollect(_variant_t((long)index));        ///在这里经常异常 //此有异常,估计你的index值有问题
    这里我就直接填的0,1,2,4,我获取的数据不会超过4列,也会有错?strcpy(Retvar,(char*)(_bstr_t)var);
    //此处应该有问题,不管什么值类型,都做字串拷贝?又是一个很怪异的取值方法?
    因为我要获取的字段存的都是int型或者字符串的,没有别的数据类型。int型获取到再atoi转一次。
      

  7.   

     _variant_t var;     
    var= m_pRecordset->GetCollect(_variant_t((long)index));        
    ==>
      _variant_t var(0L);    
    var.lVal=index;//1,2,3,4 记录中必须有这么多字段
     var= m_pRecordset->GetCollect(var);        
    ///////////
    _variant_t var(0L);
    var.lVal=index;
    var= m_pRecordset->GetCollect(var));        ///在这里经常异常 //此有异常,估计你的index值有问题
    if(var.vt != VT_NULL)   
    strcpy(Retvar,(char*)(_bstr_t)var);
    ==>直接返回var类型,然后判断vt值,如果
    字串 cstring cs=var.bstrval;
    数值 int a=var.lval
      

  8.   

    谢谢楼上的回复,但是我改成字串 cstring cs=var.bstrVal;
    数值 int a=var.lval 
    直接就异常了。
      

  9.   

    我今天调试的时候发现还有另外一种异常 
    void CloseRecordSet()
    {
    if(m_pRecordset!=NULL)  
            m_pRecordset->Close();  
    }
    这样判断也有问题?
      

  10.   

    应该不是编译环境的问题,我在程序中多个地方多次访问了同一张表,有个地方还设置了timer,整个程序只在开始初始化的时候建立了连接,整个程序都使用的这个连接,每次查询之后关闭记录集而连接没有关闭,这样有问题吗?