我是用VC++6.0ADO连接Oracle,今天想实现时间查询,字段里有date类型的Time列,于是我写语句sql=“SELECT * FROM Tablename WHERE TO_CHAR(Time,'yyyy-mm')='2007-03'”,再用m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);却始终得不到查询数据,调试发现在m_pRecordset->adoEOF就报错,意思是没有读到一行数据,但我直接用语句在oracle里查找没点问题,我也试了其他查询时间语句如SELECT * FROM Tablename WHERE Time>TO_DATE('2007-03',‘yyyy-mm'),这些语句直接用在oracle上没问题。本是想传递进一个字符串值来查询,现在却连简单的测试都通过不了,其余用VC查询操作没点问题。请问这是为什么啊,谢谢,我想不是sql语句构造的原因,请详细指教,麻烦各位了,急!谢谢。

解决方案 »

  1.   

    有可能是这个问题哦,呵呵,请问有谁知道到底支持不支持呢?
    或者我不用这个转换函数,那怎么实现查询呢,Time存储的是yyyy-mm-dd hh24:mi:ss的格式,要实现传进去查询按月查询的字符串,如2007-3,请问如何做呢,急!谢谢
      

  2.   

    应该不是没有转换函数的原因,要不然execute也不能通过,各位高手帮帮忙,急,谢谢
      

  3.   

    错误出在这一句_com_issue_error(E_POINTER);,不懂,请指教,谢谢,急
    在m_pRecordset->adoEOF中跳入
    Interface* operator->() const throw(_com_error)

    if (m_pInterface == NULL) {
    _com_issue_error(E_POINTER);
    } return m_pInterface; 
    }
      

  4.   

    if (m_pRecordset)    // 先判断一下是否有效
    {
       m_pRecordset->adoEOF;
    }
    m_pRecordset是怎么取得的?如果有错误,看一下hr的值。
      

  5.   

    自己封装的操作类
    void CAdoSet::SearchByDate(CString date)
    {
    //OpenTable("EnergyTable");
    CString sql="SELECT * FROM EnergyTable WHERE TO_CHAR(Time,'yyyy-mm')='2007-03'";

    Execute(sql);
    }bool CAdoSet::Execute(CString sql)
    {
    try
    {
    _variant_t RecordsAffected;
    m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);//这句返回hr是1
    return true;
    }
    catch(...)
    {
    AfxMessageBox("不成功");
    return false;
    }
    }
    按键响应
    CString str,name;
    str.Format("%d-%d",m_Year,m_Month);
    m_Set.SearchByDate(str);//本是传递进去,现在先没用了
    while(!m_Set.IsEOF())  //确实是无效报错的
      

  6.   

    你说的RecordsAffected是1吧?那就对了,恰好有一条记录。
    上面的代码没有定义hr, hr是指: HRESULT hr = S_OK; 
    Execute函数的返回值应是一个HRESULT类型的值。没有初始化m_Set的代码。事实上,不应该使用Execute函数,而应该使用Recordset的open函数来打开记录集。看看这个例子里ADO Recordset的使用方法:
    http://support.microsoft.com/kb/231351/zh-cn
      

  7.   

    不是,是Execute返回的是1,我用hr看了下
    我用open函数来做就直接在这句open报错了,
    初始化m_Set就是构造函数,
    CAdoSet::CAdoSet()
    {
    HRESULT hr; try
      {
      hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
      if(SUCCEEDED(hr))
      {
      hr = m_pConnection->Open("Provider=OraOLEDB.Oracle;Data Source=gdb;User Id=SYSTEM;Password=manager;","","",adModeUnknown);///连接数据库
      
      }
      }
    catch(_com_error e)///捕捉异常
      {
      CString errormessage;
      errormessage.Format("连接数据库失败!\r\n错误信息:%s",e.ErrorMessage());
      AfxMessageBox(errormessage);///显示错误信息
      } }
      

  8.   

    m_pRecordset怎么初始化的?这里有更多来自MSDN的例子:
    http://msdn2.microsoft.com/en-us/library/ms677563.aspx
      

  9.   

    void CAdoSet::SearchByDate(CString date)
    {
    m_pRecordset.CreateInstance("ADODB.Recordset");
    //OpenTable("HistricEnergyTable");'
    CString sql="SELECT * FROM HistrcEnergyTable WHERE AMRTime LIKE '2007-03%";

    // m_pRecordset->Open(_variant_t(sql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);

    Execute(sql);
    }
      

  10.   

    sorry, 没有qq。 MSN: [email protected]总是检查函数调用的返回值,否则很难发现是哪一步出错。尝试:
    m_pRecordset = m_pConnection->Execute(_bstr_t(sql),&RecordsAffected,adCmdText);//这句返回hr是1
    此时返回一个记录集对象或者使用:
    hr = m_pRecordset->Open(_variant_t(sql),_variant_t((IDispatch *)m_pConnection,true),adOpenDynamic,adLockOptimistic,adCmdText);看看hr是什么?
      

  11.   

    调通了,呵呵,谢谢你了,应该是开始没实例,而且确实是Execute不能执行