解决方案 »

  1.   

            strcpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"));
            strcpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"));
            strcpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"));  strcpy 会导致溢出, 你调试看看这几个变量的值是否超出大小
      

  2.   

    bool Test()
    {
        char    szSql[64] = "select * from TEST";
        int        iRows = 0;
        char    szError[512] = {0};
        char     szID[128] = {0};
        char     szName[128] = {0};
        char     szAddress[128] = {0};    try
        {
            _RecordsetPtr  pRecord  = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
            strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0;
            strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0;
            strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0
            pRecord->Close();
     
        }
        catch(_com_error e)
        {       
            printf("%s\n", e.ErrorMessage())       
            exit(-1);
        }
     
        return true;
    }
      

  3.   

    谢谢回复,应该不是缓冲区过小导致问题的。
    我代码改成下面这样函数返回后报同样的错误。string strID = (char*)(_bstr_t)pRecord->GetCollect("ID");
    string strName = (char*)(_bstr_t)pRecord->GetCollect("Name");
    string strAddress = (char*)(_bstr_t)pRecord->GetCollect("Address");
      

  4.   

    感谢回复,我按照老师说的,改成下面这样,函数返回后报同样的错误!char  szID[128] = {0};
    strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);
    char  szName[128] = {0};
    strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);
    char  szAddress[128] = {0};
    strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127);
      

  5.   

    按照赵老师说的函数返回时还是报同样的错!bool Test()
    {
    char    szSql[64] = "select * from YF_TEST";
    int        iRows = 0;
    char    szError[512] = {0};
    char     szID[128] = {0};
    char     szName[128] = {0};
    char     szAddress[128] = {0}; try
    {
    _RecordsetPtr  pRecord  = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
    strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0;
    strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0;
    strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0;
    pRecord->Close(); }
    catch(_com_error e)
    {       
    printf("%s\n", e.ErrorMessage());     
    exit(-1);
    } return true;
    }
      

  6.   

        char     szID[128] = {0};
        char     szName[128] = {0};
        char     szAddress[128] = {0};
        strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"),127);szID[127]=0;
        strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"),127);szName[127]=0;
        strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"),127);szAddress[127]=0;

    char     szID[128] = {0};
    strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);
    char     szName[128] = {0};
    strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);
    char     szAddress[128] = {0};
    strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127);   strncpy(szID, (char*)(_bstr_t)pRecord->GetCollect("ID"), 127);
    char     szName[128] = {0};
    strncpy(szName, (char*)(_bstr_t)pRecord->GetCollect("Name"), 127);
    char     szAddress[128] = {0};
    strncpy(szAddress, (char*)(_bstr_t)pRecord->GetCollect("Address"), 127);   
    不是一回事!
      

  7.   

    char    szSql[64] = "select * from YF_TEST";
    改为
    char    szSql[64] = "select * from YF_TEST where rownum<1000";//防止表YF_TEST万一有≥100万条记录
    试试看。
      

  8.   

    或者
    static   char    szSql[64] = "select * from YF_TEST";
        int        iRows = 0;
    static    char    szError[512] = {0};
    static    char     szID[128] = {0};
    static    char     szName[128] = {0};
    static    char     szAddress[128] = {0};在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
      

  9.   

    1.ADO在读取记录之前要先判断是否有记录,对空记录进行读取会报错的
    2.数据库_variant_t的NULL值是不能这样强制转换的
    可以看下这里的例子,C++熟悉的话推荐用ADO类方便一些。
      

  10.   

     这样是没用的,数据库里面只有一条测试数据。
    都改为静态变量后Debug没有报错了,但想不通是Test函数里定义的所有字符数组加起来不超过1024字节啊!
      

  11.   

    我感觉是下面两句有问题,
     char    szSql[64] = "select * from TEST";
      _RecordsetPtr  pRecord  = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText); 
    问题出现在(_bstr_t)szSql,由于szSql是char数据,而(_bstr_t)是宽字符。
    楼主可以把char    szSql[64] = "select * from TEST";改在(_bstr_t)类型来式式,使用sysallocstring来创建一个(_bstr_t)
      

  12.   

    再次调试后发现是_RecordsetPtr  pRecord  = m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);这句导致Debug调试问题的,估计和ADO里面的com类型有关,改为下面这样Debug就不报错了。哪位高人可以解释下原因。bool Test()
    {
    char    szSql[64] = "select * from YF_TEST";
    int        iRows = 0;
    char    szError[512] = {0};
    char    szID[128] = {0};
    char    szName[128] = {0};
    char    szAddress[128] = {0}; _RecordsetPtr pRst(__uuidof(Recordset));
    _CommandPtr pCmd(__uuidof(Command)); try
    {              
    pCmd->put_ActiveConnection(_variant_t((IDispatch*)m_conPtr));
    pCmd->CommandText=szSql;
    pRst=pCmd->Execute(NULL,NULL,adCmdText); strcpy(szID, (char*)(_bstr_t)pRst->GetCollect("ID"));
    strcpy(szName, (char*)(_bstr_t)pRst->GetCollect("Name"));
    strcpy(szAddress, (char*)(_bstr_t)pRst->GetCollect("Address"));   
    pRst->Close(); }
    catch(_com_error e)
    {       
    printf("%s\n", e.ErrorMessage());   
    exit(-1);
    } return true;
    }
      

  13.   

    int        iRows;
    m_conPtr->Execute((_bstr_t)szSql,(VARIANT*)&iRows,adCmdText);
    肯定是不能这样强制转换的,两个数据类型大小都不一致。
      

  14.   

    这就是问题所在,第二个参数填NULL或VARIANT指针类型后,Debug不再报错,感谢大家的耐心指教!