rottenapple

博客园 首页 新随笔 联系 订阅 管理
前一阵子做一个项目,就是把以前SqlServer的数据库移植到Oracle中,要求是在原有代码的基础上修改,使应用程序可以同时运行在两种不同的数据库上。这是我第一次接触用C#操作Oracle。走了不少弯路,现在把它记下来,也希望可以别人少走一些弯路。
 

1.  Oracle中表名,字段名,存储过程名,变量名不能超过30个字符串长度。

2.  Oracle中不支持Top 语法。使用where rownum < n 代替。但需要注意如果在Top前有排序的操作,则需要先排序在利用rownum取得。

3.  Oracle中光标的使用与SqlServer中有挺大差别,主要是在循环控制方面不一致。

4.  Oracle中如果某列是Date类型,那么它默认的格式是yyyy-MM-dd,如果使用

where colDate = ‘2005-06-08 17:14:57’就会出错,‘2005-06-08’可以。如果此时需要精确比较时间(小时,分,秒),可以采用下列方法:TO_DATE('2005-6-8 17:14:57','yyyy-mm-dd hh24:mi:ss')。由于OracleSQLServerDateTime上对SQL标准的拓展实现方式不同,因此不能用同一个

   SQL实现。

5.  Oracle中的TimeStamp(时间戳)SqlServer中的差别很大。SqlServer中的TimeStamp是二进制格式存储在数据库中,可以将DataSet中的这个字段类型设定为base64Binary类型。Oracle中的TimeStamp是时间格式存储的。因此,无法用同一个DataSet既装载SqlServerTimeStamp,有装载OracleTimeStamp.由于在应用程序中很少用到这个值,因此可以不检索这个字段。

6.  Oracle中的TimeStamp不能像SqlServer在传入数据的时候自动填充,可以设定默认值systimestamp来实现类似功能。

7.  Oracle中没有Boolean的字段类型,可以用intger或者char代替SqlServer中的bit类型。

8.  Oracle中会将””空字符串当多NULL处理,也就是说,当应用程序往数据库中插入一个空字符串时,实际数据库会尝试插入一个NULL。如果这个字段是NOTNULL类型,那么就会出错,这种情况下可以用别的默认值代替空字符串。当从SqlServer导入数据到Oracle的时候,在NOTNULL列上的空字符串会导致导出操作失败。此时可以在导出向导中手工修改SQL脚本,将空字符串设定成一个特殊值。

9.  在利用OLEDBCommand调用Oracle存储过程的时候应注意,应用程序传入参数与存储过程中的参数是按照顺序匹配而不是名称,这一点是和SqlServer有着本质的不同。在调试的时候如果遇到E_Fail等错误,可以参考下列顺序检查程序。

(1)检查应用程序传入参数个数与存储过程的参数个数是否一致。

(2)                   检查应用程序传入参数的顺序是否与存储过程参数的顺序一致,这一点很重要,如果不匹配很容易导致各种看似奇怪的问题。建议对相对简单的存储过程(单表的增删改)写一个自动生成工具来完成此操作。

(3)                   检查存储过程是否正确。

10.                      使用OleDbDataReader对象需要特别注意。在SqlServer中我们可以在存储过程中利用一句Select语句返回一个DataReader,但是在Oracle中不能这样做,必须用Oracle REF CURSOR 返回查询结果。但此时需要使用OracleCommand.ExecuteReader() 方法,而不能使用OLEDBCommand对象。因此,如果想在Oracle中使用DataReader,必须使用微软提供的For Oracle Data Provide类包。这个Framework1.0中默认不存在,需要下载,在Framework11.1中默认存在。具体方法参考:

http://msdn.microsoft.com/library/chs/default.asp?url=/library/CHS/cpguide/html/cpconusingadonetproviderstoaccessdata.asp

posted on 2005-06-09 14:41  rottenapple  阅读(2156)  评论(3编辑  收藏  举报