当在.net应用中,应用程序中调用的sql语句使用绑定变量,导致在oracle中的语句执行计划不正确,主要是由于数据类型的不匹配导致的。解决办法就是将.net中的数据类型与oracle数据库中的类型匹配。
下表是oracle与.net中的数据类型映射表 :
[@more@]下表列出 Oracle 数据类型及其与 OracleDataReader 的映射。
Oracle 数据类型 | 由 OracleDataReader.GetValue 返回的 .NET Framework 数据类型 | 由 OracleDataReader.GetOracleValue 返回的 OracleClient 数据类型 | 备注 |
---|---|---|---|
BFILE | Byte[] |
| |
BLOB | Byte[] |
| |
CHAR | String |
| |
CLOB | String |
| |
DATE | DateTime |
| |
FLOAT | Decimal | 此数据类型是 NUMBER 数据类型的别名,其设计目的是使 OracleDataReader 返回 System.Decimal 或 OracleNumber,而不是浮点值。使用该 .NET Framework 数据类型可能导致溢出。 | |
INTEGER | Decimal | 此数据类型是 NUMBER(38) 数据类型的别名,其设计目的是使 OracleDataReader 返回 System.Decimal 或 OracleNumber,而不是整数值。 使用 .NET Framework 数据类型可能导致溢出。 | |
INTERVAL YEAR TO MONTH | Int32 |
| |
INTERVAL DAY TO SECOND | TimeSpan |
| |
LONG | String |
| |
LONG RAW | Byte[] |
| |
NCHAR | String |
| |
NCLOB | String |
| |
NUMBER | Decimal | 使用 .NET Framework 数据类型可能导致溢出。 | |
NVARCHAR2 | String |
| |
RAW | Byte[] |
| |
REF CURSOR |
|
| OracleDataReader 对象不支持 Oracle REF CURSOR 数据类型。 |
ROWID | String |
| |
TIMESTAMP | DateTime |
| |
TIMESTAMP WITH LOCAL TIME ZONE | DateTime |
| |
TIMESTAMP WITH TIME ZONE | DateTime |
| |
UNSIGNED INTEGER | Number | 此数据类型是 NUMBER(38) 数据类型的别名,其设计目的是使 OracleDataReader 返回 System.Decimal 或 OracleNumber,而不是无符号整数值。 使用 .NET Framework 数据类型可能导致溢出。 | |
VARCHAR2 | String |
|
下表列出了在将数据类型作为参数绑定时使用的 Oracle 数据类型和 .NET Framework 数据类型(System.Data.DbType 和 OracleType)。
Oracle 数据类型 | 要绑定为参数的 DbType 枚举 | 要绑定为参数的 OracleType 枚举 | 备注 |
---|---|---|---|
BFILE |
| BFile | Oracle 只允许将 BFILE 绑定为 BFILE 参数。 如果您尝试绑定一个非 BFILE 值(如 byte[] 或 OracleBinary),适用于 Oracle 的 .NET 数据提供程序并不会自动为您构造这样的值。 |
BLOB |
| Blob | Oracle 只允许将 BLOB 绑定为 BLOB 参数。 如果您尝试绑定一个非 BLOB 值(如 byte[] 或 OracleBinary),适用于 Oracle 的 .NET 数据提供程序并不会自动为您构造这样的值。 |
CHAR | AnsiStringFixedLength | Char |
|
CLOB |
| Clob | Oracle 只允许将 CLOB 绑定为 CLOB 参数。 如果您尝试绑定一个非 CLOB 值(如 System.String 或 OracleString),适用于 Oracle 的 .NET 数据提供程序并不会自动为您构造这样的值。 |
DATE | DateTime | DateTime |
|
FLOAT | Single、Double、Decimal | Float、Double、Number | Size 确定 System.Data.DBType 和 OracleType。 |
INTEGER | SByte、Int16、Int32、Int64、Decimal | SByte、Int16、Int32、Number | Size 确定 System.Data.DBType 和 OracleType。 |
INTERVAL YEAR TO MONTH | Int32 | IntervalYearToMonth | 只有在同时使用 Oracle 9i 客户端和服务器软件时,OracleType 才可用。 |
INTERVAL DAY TO SECOND | Object | IntervalDayToSecond | 只有在同时使用 Oracle 9i 客户端和服务器软件时,OracleType 才可用。 |
LONG | AnsiString | LongVarChar |
|
LONG RAW | Binary | LongRaw |
|
NCHAR | StringFixedLength | NChar |
|
NCLOB |
| NClob | Oracle 只允许将 NCLOB 绑定为 NCLOB 参数。 如果您尝试绑定一个非 NCLOB 值(如System.String 或 OracleString),适用于 Oracle 的 NET 数据提供程序并不会自动为您构造这样的值。 |
NUMBER | VarNumeric | Number |
|
NVARCHAR2 | String | NVarChar |
|
RAW | Binary | Raw |
|
REF CURSOR |
| Cursor | 有关更多信息,请参见Oracle REF CURSOR。 |
ROWID | AnsiString | Rowid |
|
TIMESTAMP | DateTime | Timestamp | 只有在同时使用 Oracle 9i 客户端和服务器软件时,OracleType 才可用。 |
TIMESTAMP WITH LOCAL TIME ZONE | DateTime | TimestampLocal | 只有在同时使用 Oracle 9i 客户端和服务器软件时,OracleType 才可用。 |
TIMESTAMP WITH TIME ZONE | DateTime | TimestampWithTz | 只有在同时使用 Oracle 9i 客户端和服务器软件时,OracleType 才可用。 |
UNSIGNED INTEGER | Byte、UInt16、UInt32、UInt64、Decimal | Byte、UInt16、Uint32、Number | Size 确定 System.Data.DBType 和 OracleType。 |
VARCHAR2 | AnsiString | VarChar |
|
由 OracleParameter 对象的 Value 属性使用的 InputOutput、Output 和 ReturnValue ParameterDirection 值为 .NET Framework 数据类型,除非输入值是 Oracle 数据类型(例如 OracleNumber 或 OracleString)。这并不适用于 REF CURSOR、BFILE 或 LOB 数据类型
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/73920/viewspace-1028193/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/73920/viewspace-1028193/