问题是这样的,我通过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也是头一次接触,还希望各位多多指教!先行谢过!
这里的特别之处在于:
select * from (Select...
这个from与(之间有一个空格
则会在编译器的输出信息中看到如下信息:
0x7c812afb 处最可能的异常: Microsoft C++ 异常: 内存位置 0x015ddf98 处的 long。
可是如果把这个空格去掉,如:
select * from(Select...
这样就任何异常信息都看不到.
并且这个异常不是我捕获到异常,它只是在输出窗口进行显示,却对程序的运行没有影响,由于程序需要长时间运作,所以我担心时间长了会引起其他问题,请问有人碰到过类似问题么?
另外还有一个问题,就是我通过ADO调用ORACLE的存储过程,不管是读取,插入,还是更新操作都可以正常执行,可是就像上面提到的,也会在输出窗口显示异常信息,程序却还是继续正常执行.
0x7c8101d8 处最可能的异常: 0xC0000005: 读取位置 0x00000000 时发生访问冲突
同样的操作在对MSSQL和MYSQL都是正常的.
小弟菜鸟,对ORACLE也是头一次接触,还希望各位多多指教!先行谢过!
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上都让程序持续执行上半年多了,应该不存在问题的吧!
if(!m_adoRcrd.Open(strSQL,adCmdText))
{
WriteLog("读取等待发送信息出错",1);
AddToDispListShow(m_adoConnect.GetLastErrorText());
m_adoRcrd.Close();
return -2;
}
这是我调用执行SQL的代码,当from与(之间没有空格时是正常的,可是当有空格就会显示异常信息了
return Open(LPCTSTR(strConnect), lOptions);
以上是我连接ORACLE数据库的连接字串
各位帮忙看看,有什么话尽管说,要喷我我也全部接受.
只要给意见就好,谢谢了
没空格,表示sql有问题,程序不报内存错,而报sql语法错我只能猜测程序是在执行recordset的Open方法,获得结果集的时候报错。其实你也可以试试 将sql替换成"select 1 from dual"试试看,报错与否,这个sql最简单不过
谢谢6楼的分析:
select 1 from dual这条语句测试一切正常.
另外不带子查询的情况也一切正常,在带子查询的情况下,也只有from和(之间有空格的时候才会显示异常信息,没有的话也是一切正常.
另外这个类是我经过更改,优化长期测试后认可的,也可能是在对ORACLE的处理上还存在BUG,我现在所做的也就是努力找出它.
请6楼继续猜测,呵呵,为什么只有在这种特殊情况下才会出这个问题呢?
另外有没有空格从理论上来讲都是不会有SQL语法错误的,实际上也没有报错.
我还想问下访问存储过程时的异常信息可能是什么原因呢?
建议将所有的数据库操作放在try,catch里
除了捕捉数据库的异常,还要捕捉内存异常。
在catch块里将报错信息输出看一下。
你有什么资格XXX的,免费义务劳动还得被你这种人掉价,你够傻得可以了
我在CSDN这么久还真没见过你人品这么差的提问者。