ORACLE与.NET类型对应关系
想来这个是最重要的事情了,因为多数情况下,我们使用dbhelper来调用数据库的时候,是因为如下三个地方导致错误:
1、错误的sql语句:末尾多了分号,少了部分关键字
2、sql中的参数与parameter[]不对应。
3、parasmeter[]中的数据类型转为Oracle的数据类型中出错。
通常情况下,我们大设置paramenter[]时,只会给出变量名和对应的值(多数是.NET中的变量)去让ODP自动执行数据类型转换,而ODP一般都可以正确的转换,但是,有时候也会出现一些意外的情况,这时,就需要我们手动来明确的设置。
ODP.NET的数据类型以结构体或者类的形式来支持ORACLE的本地类型以及PL/SQL的数据类型。其中结构体是值类型,而类则是引用类型。
ORACLE的数据类型比.NET自己的数据类型具有更大的优势,比如OracleDecimal支持38位而.NET的Decimal只支持28位。
下面表中展示了ORACLE数据库的本地类型(包含PL/SQL的)、ODP.NET的数据类型以及.NET的数据类型的对应关系。
而我们要关心的是把.NET的数据类型转为正确的ODP.NET数据类型就ok了,剩下的操作ODP.NET会帮助我们转换,说白了,就是我们在New OracleParamter(){ParameterName=":name",Value=var}
的时候,确保我们的.NET类型var与数据库中的对应,或者在我们.NET数据类型无法满足使用的时候,使用ODP.NET的类型声明变量类型。
Oracle Native Data Type or PL/SQL Data Type
|
ODP.NET Type
|
.NET Framework Data Types
|
BFILE
|
OracleBFile class
|
System.Byte[]
|
BINARY_DOUBLE
|
OracleDecimal structure
|
System.Decimal
|
BINARY_FLOAT
|
OracleDecimal structure
|
System.Decimal
|
BINARY_INTEGER (PL/SQL only)
|
OracleDecimal structure
|
System.Decimal
|
BLOB
|
OracleBlob class
|
System.Byte[]
|
BOOLEAN (PL/SQL only)
|
OracleBoolean structure
|
System.Boolean
|
CHAR
|
OracleString structure
|
System.String
|
CLOB
|
OracleClob class
|
System.String
|
DATE
|
OracleDate structure
|
System.DateTime
|
INTERVAL DAY TO SECOND
|
OracleIntervalDS structure
|
System.TimeSpan
|
INTERVAL YEAR TO MONTH
|
OracleIntervalYM structure
|
System.Int64
|
LONG
|
OracleString structure
|
System.String
|
LONG RAW
|
OracleBinary structure
|
System.Byte[]
|
NCHAR
|
OracleString structure
|
System.String
|
NCLOB
|
OracleClob class
|
System.String
|
NUMBER
|
OracleDecimal structure
|
System.Decimal
|
NVARCHAR2
|
OracleString structure
|
System.String
|
PLS_INTEGER (PL/SQL only)
|
OracleDecimal Structure
|
System.Decimal
|
RAW
|
OracleBinary structure
|
System.Byte[]
|
REF
|
OracleRef class
|
System.String
|
REF CURSOR (PL/SQL only)
|
OracleRefCursor class
|
Not Applicable
|
ROWID
|
OracleString structure
|
System.String
|
TIMESTAMP
|
OracleTimeStamp structure
|
System.DateTime
|
TIMESTAMP WITH LOCAL TIMEZONE
|
OracleTimeStampLTZ structure
|
System.DateTime
|
TIMESTAMP WITH TIME ZONE
|
OracleTimeStampTZ structure
|
System.DateTime
|
UROWID
|
OracleString structure
|
System.String
|
VARCHAR2
|
OracleString structure
|
System.String
|
XMLType
|
OracleXmlType class
|
System.String
|
需要注意的是:
- 所有数字类型都使用DECIMAL,除了INTERVAL YEAR TO MONTH对应INT64除外(这个类型我们基本不会使用到)。
- ROWID,UROWID使用的是STRING而不是数字类型.
- 时间相关的全部使用DateTime,除了INTERVAL DAY TO SECOND使用TimeSpan(这个类型我们基本不会使用到)。
- RAW使用的是Byte[],所以,LONG RAW使用的也是Byte[].