问题是这样的,我通过ADO访问ORACLE数据库,在insert或者update操作时正常,但是在select操作时,如果我的SQL如下:select * from (Select *  from testtasktable where rownum <=%d order by oracleidd asc) order by content asc
这里的特别之处在于:
select * from (Select...
这个from与(之间有一个空格
则会在编译器的输出信息中看到如下信息:
0x7c812afb 处最可能的异常: Microsoft C++ 异常: 内存位置 0x015ddf98 处的 long。
可是如果把这个空格去掉,如:
select * from(Select...
这样就任何异常信息都看不到.
并且这个异常不是我捕获到异常,它只是在输出窗口进行显示,却对程序的运行没有影响,由于程序需要长时间运作,所以我担心时间长了会引起其他问题,请问有人碰到过类似问题么?
另外还有一个问题,就是我通过ADO调用ORACLE的存储过程,不管是读取,插入,还是更新操作都可以正常执行,可是就像上面提到的,也会在输出窗口显示异常信息,程序却还是继续正常执行.
0x7c8101d8 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
同样的操作在对MSSQL和MYSQL都是正常的.
小弟菜鸟,对ORACLE也是头一次接触,还希望各位多多指教!先行谢过!

解决方案 »

  1.   

    可能不只是sql语句的问题,把select的整个操作代码贴出来
      

  2.   

    select 的整个操作代码都贴出来了啊!
    select * from (Select *  from testtasktable where rownum <=%d order by oracleidd asc) order by content asc 
    就这么一句
    由于我用的ADO是网上下载的陈真的ADO的封装类,自己再进行一些处理后的,所以代码放出来各位也可能会觉得比较生...
    我现在主要是将MSSQL MYSQL和ORACLE的操作进行归一化,基本上都处理好了,就是这两个异常信息总让我睡不着啊,虽然暂时没有问题,我就是怕哪天死掉了!
    ASSERT(m_pConnection != NULL);
    ASSERT(m_pRecordset != NULL);
    ASSERT(AfxIsValidString(strSQL)); if(strcmp(strSQL, _T("")) != 0)
    {
    m_strSQL = strSQL;
    }
    if (m_pConnection == NULL || m_pRecordset == NULL)
    {
    return FALSE;
    } if (m_strSQL.IsEmpty())
    {
    ASSERT(FALSE);
    return FALSE;
    } try
    {
    if (IsOpen()) Close();
    return SUCCEEDED(m_pRecordset->Open(_variant_t(LPCTSTR(m_strSQL)), 
    _variant_t((IDispatch*)m_pConnection->GetConnection(), true),
    CursorType, LockType, lOption));
    }
    catch (_com_error e)
    {
    TRACE(_T("Warning: 打开记录集发生异常. 错误信息: %s; 文件: %s; 行: %d\n"), e.ErrorMessage(), __FILE__, __LINE__);
    TRACE(_T("%s\r\n"), GetLastError());
    return FALSE;
    }
    以上是他封装的执行SQL语句的代码,我在MSSQL上都让程序持续执行上半年多了,应该不存在问题的吧!
      

  3.   

    strSQL = "select * from(Select * from testtasktable where rownum<=1000 order by oracleidd asc) order by content asc";
    if(!m_adoRcrd.Open(strSQL,adCmdText))
    {
    WriteLog("读取等待发送信息出错",1);
    AddToDispListShow(m_adoConnect.GetLastErrorText());
    m_adoRcrd.Close();
    return -2;
    }
    这是我调用执行SQL的代码,当from与(之间没有空格时是正常的,可是当有空格就会显示异常信息了
      

  4.   

    strConnect.Format("Provider=OraOLEDB.Oracle.1;PLSQLRSet=1;Server=%s;Data Source=%s;User ID=%s;Password=%s",strServer,strDatabase,strUID,strPwd);
    return Open(LPCTSTR(strConnect), lOptions);
    以上是我连接ORACLE数据库的连接字串
    各位帮忙看看,有什么话尽管说,要喷我我也全部接受.
    只要给意见就好,谢谢了
      

  5.   

    有空格,表示sql语法没问题,而此时程序报内存错
    没空格,表示sql有问题,程序不报内存错,而报sql语法错我只能猜测程序是在执行recordset的Open方法,获得结果集的时候报错。其实你也可以试试 将sql替换成"select 1 from dual"试试看,报错与否,这个sql最简单不过
      

  6.   

    操作Oracle直接用ADO就好了,根本没必要用别人的类,因为他们也能有bug。ADO操作又不难的
      

  7.   

    谢谢6楼,7楼就不谢了,你说的对本问题没有任何帮助!
    谢谢6楼的分析:
    select 1 from dual这条语句测试一切正常.
    另外不带子查询的情况也一切正常,在带子查询的情况下,也只有from和(之间有空格的时候才会显示异常信息,没有的话也是一切正常.
    另外这个类是我经过更改,优化长期测试后认可的,也可能是在对ORACLE的处理上还存在BUG,我现在所做的也就是努力找出它.
    请6楼继续猜测,呵呵,为什么只有在这种特殊情况下才会出这个问题呢?
    另外有没有空格从理论上来讲都是不会有SQL语法错误的,实际上也没有报错.
    我还想问下访问存储过程时的异常信息可能是什么原因呢?
      

  8.   

    程序是多线程的吗?
    建议将所有的数据库操作放在try,catch里
    除了捕捉数据库的异常,还要捕捉内存异常。
    在catch块里将报错信息输出看一下。
      

  9.   

    你个SB,自己菜就罢了,还跑出来丢人显眼。我回复怎么了?看你不爽!
    你有什么资格XXX的,免费义务劳动还得被你这种人掉价,你够傻得可以了
      

  10.   

    CSDN上帮助人都是免费的,帮你是福分,不帮你是本分。我一开始是不是好心来回答你的?你说呢?我难道应该跑过来看下你帖子然后回复你?吃饱了撑的
      

  11.   

    注意下你的语气,你很了不起?你了不起怎么还要上来提问?
    我在CSDN这么久还真没见过你人品这么差的提问者。