如题,代码如下,调试运行的时候在open函数出错,请问那个参数写的不对,我照着一本书上写的啊
void CStudentDlg::OnQuery() 
{
// TODO: Add your control notification handler code here
UpdateData(true);
CString strSql;
if(m_name != "" && m_age != "")
strSql.Format("SELECT * FROM student_info WHERE name = '%s' AND   age = '%s'",m_name,m_age);
else if(m_name != "" && m_age == "")
strSql.Format("SELECT * FROM student_info WHERE name = '%s'",m_name);
else if(m_name == "" && m_age != "")
strSql.Format("SELECT * FROM student_info WHERE age = '%s'",m_age);
else
strSql = "SELECT * FROM student_info";
try
{
m_pRecordset->Close();

m_pRecordset->Open(strSql.AllocSysString(),                
theApp.m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);
}
catch(_com_error *e)
{
AfxMessageBox(e->ErrorMessage());
}
ListData();
}

解决方案 »

  1.   

    上面的sql语句没有问题,就是运行到open()的时候出现问题
    显示错误是runtime error!请问是怎么回事啊.谢谢
      

  2.   

    调用close()是为了先把以前的先清除掉啊
    敢问上面的仁兄,你指的实例化是?
      

  3.   

    我数据库中的name和age都是text
      

  4.   

    ADO的老问题了。调试的时候应注意:
    1)m_pRecordset一定是有效的指针
    2)m_pRecordset->Open(),这句断住,察看strSql的值,最好去SQL Query里运行验证一下
    3)if (!m_pPecordset->adoEOF) 表明结果集里有数据,你可以ListData()
       else return ;   catch(_com_error *e)放ListData()下面
      

  5.   

    回复what_a_big()老兄:
    就是在open这一句出的问题,还没执行到下面的那句呢,strsql的值经过验证过了,没有问题啊
      

  6.   

    我的.cpp是下面的源码:Rs->Open(tsql.AllocSysString(),_variant_t((IDispatch*)Conn,true),adOpenDynamic,adLockOptimistic,adCmdText) ;Conn是你的m_pConnection,一定要有效的指针。
      

  7.   

    我这个m_pconnection是在app里面open过的啊,肯定是有效指针,我看有的书上是
    theApp.m_pConnection.GetInterfacePtr()这么写的,其实也不是很明白它的意思.反正还是没有编译通过.
      

  8.   

    其实还是T97102003(池塘里的水手)这位老兄点破玄机了,我name和age都是用的text,我把他们都改成varchar就ok了,为什么会这样啊?现在已经没问题了,不过还是感谢大家.等有人回答我这个问题,就结贴.在数据库字段类型设置的时候需要注意什么?
      

  9.   

    _RecordsetPtr pHRecord = NULL;
    HRESULT hr ;// strcpy(sql,"select * from 闾胥路_MODELDB");
    hr = pHRecord.CreateInstance(__uuidof(Recordset));   //创建实例,查询
    if(SUCCEEDED(hr))
    {
    try                 //根据sql 读取数据记录
    {      
    hr = pHRecord->Open(_variant_t(sql),ptr.GetInterfacePtr(),
    adOpenStatic,
    //adLockOptimistic,
    adLockReadOnly,
    adCmdText);
    if(FAILED(hr))
    return NULL; }catch(_com_error ex)
    {
    printf("sql %s ......\n", sql);
    printf("CAdoBlockDriver ::QueryBySql %s\n",ex.ErrorMessage());
    printf("CAdoBlockDriver ::QueryBySql %s\n",(char*)(ex.Description()));
    bool bTry = true;
    int tryCount = 0;
    while(bTry)
    {
    if(tryCount > 5)
    return NULL;

    Sleep(20);
    try
    {
    hr = pHRecord->Open(_variant_t(sql),ptr.GetInterfacePtr(),
    adOpenStatic,
    //adLockOptimistic,
    adLockReadOnly,
    adCmdText);
    if(FAILED(hr))
    return NULL;
    }catch(_com_error epp)
    {
    printf("CAdoBlockDriver ::QueryBySql  %s, TRY : %d\n",ex.ErrorMessage(),tryCount);
    printf("CAdoBlockDriver ::QueryBySql second %s, TRY : %d\n",(char*)(ex.Description()),tryCount);
    //pHRecord = NULL;
    //return NULL;
    }
    tryCount++;
    }

    }
    }
      

  10.   

    上述的重试是为了解决oracle ora-03114的问题,不过还不是很好。