System.Runtime.InteropServices.COMException (0x80041538): Underlying DBMS error [SDE.*****]
异常如下图所示:
一、问题描述:
1)C#、VS2010、Arcengine10.1、Oracle11g;
2)程序进行栅格数据导入SDE过程中弹出上述异常;
二、思考ing:
从异常信息看是跟数据库相关。当时测试时,导入一个20MB的 tif 影像,导入成功;但导入一个300MB的 tif 影像时,则出现该异常。
首先推测异常的出现可能跟数据大小有关,进而怀疑数据毕竟多大时才会触发异常,顺着这一思路(即触发异常的数据大小的阈值该是多少)继续思考,对于影像数据而言几百MB只能属于小数据,这么小的数据都能引起异常显然不科学。再结合异常信息中的DBMS,会不会是跟数据库表大小有关?
将这个猜测在网上查,还真发现关于SDE表空间大小一些相关资料。首先查看了当前SDE表空间中可用空间大小,发现只有几十MB,这就回答了为何20MB的影像可以成功导入,而300MB的影像却导入失败,因为SDE的表空间已经用完,没有足够的空间来装入新数据。
确定是表空间大小的问题,解决的思路便是给SDE表空间增加空间,网上搜“SDE表空间”之类就能得到很多信息,我采用了让表空间自增的解决方案(也可以用增加SDE表空间的数据文件来解决)。下面是具体解决方法,仅供参考。
三、解决方法:
【说明】步骤1)和步骤2)在客户端或服务器查看均可以;步骤3)需要在服务器端进行。步骤2)中得到的FILE_NAME字段的值也指的是服务器端的路径。
1)查看当前表空间使用情况;(我都是在PLSQL里输入SQL命令查询的,下同)
select tablespace_name, sum(bytes)/(1024*1024) as free_space
from dba_free_space
group by tablespace_name;
查询结果如下:
也可以用下面这个SQL语句,都是查看表空间使用情况,下面这个信息更丰富些。
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
2)查找SDE表空间中数据文件的全路径;(第3步会用到)
SELECT * FROM DBA_DATA_FILES t where t.TABLESPACE_NAME = 'SDE';
【注意】这里的FILE_NAME字段的值指的服务器端的路径,在服务器上,定位到该目录下可以找到SDE.DBF文件并查看其大小。
3)修改SDE表空间为自增长(通过服务器上本地存放文件来设置);
ALTER DATABASE DATAFILE 'C:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\SDE.DBF' AUTOEXTEND ON NEXT 100M MAXSIZE UNLIMITED
意思是,把”C:\APP\ADMINISTRATOR\PRODUCT\11.2.0\DBHOME_1\SDE.DBF“这个文件的自增长设置为100MB,当然这个步幅可以根据自己情况设置。
至此,修改SDE表空间大小已完成,导入一个较多数据时,可以看到SDE.DBF的大小会相应变化。
参考资料:http://www.cnblogs.com/Jingkunliu/p/5177954.html http://blog.sina.com.cn/s/blog_5d32e4930100mqxy.html
四、总结:
对比测试出错的地方和测试正确的地方,合理猜测可能出错的原因,进而对其进行验证。确定了原因便可以对症下药,找其解决方法。
解决方法仅供参考。