程式中使用繫結變數,執行計劃不正確

fanhongjie發表於2009-10-27

當在.net應用中,應用程式中呼叫的sql語句使用繫結變數,導致在oracle中的語句執行計劃不正確,主要是由於資料型別的不匹配導致的。解決辦法就是將.net中的資料型別與oracle資料庫中的型別匹配。

下表是oracle與.net中的資料型別對映表 :

[@more@]
Oracle 資料型別對映

下表列出 Oracle 資料型別及其與 的對映。

Oracle 資料型別

由 OracleDataReader.GetValue 返回的 .NET Framework 資料型別

由 OracleDataReader.GetOracleValue 返回的 OracleClient 資料型別

備註

BFILE

Byte[]

BLOB

Byte[]

CHAR

String

CLOB

String

DATE

DateTime

FLOAT

Decimal

此資料型別是 NUMBER 資料型別的別名,其設計目的是使 返回 System.Decimal,而不是浮點值。使用該 .NET Framework 資料型別可能導致溢位。

INTEGER

Decimal

此資料型別是 NUMBER(38) 資料型別的別名,其設計目的是使 返回 System.Decimal,而不是整數值。 使用 .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

物件不支援 Oracle REF CURSOR 資料型別。

ROWID

String

TIMESTAMP

DateTime

TIMESTAMP WITH LOCAL TIME ZONE

DateTime

TIMESTAMP WITH TIME ZONE

DateTime

UNSIGNED INTEGER

Number

此資料型別是 NUMBER(38) 資料型別的別名,其設計目的是使 返回 System.Decimal,而不是無符號整數值。 使用 .NET Framework 資料型別可能導致溢位。

VARCHAR2

String

下表列出了在將資料型別作為引數繫結時使用的 Oracle 資料型別和 .NET Framework 資料型別(System.Data.DbType)。

Oracle 資料型別

要繫結為引數的 DbType 列舉

要繫結為引數的 OracleType 列舉

備註

BFILE

BFile

Oracle 只允許將 BFILE 繫結為 BFILE 引數。 如果您嘗試繫結一個非 BFILE 值(如 byte[]),適用於 Oracle 的 .NET 資料提供程式並不會自動為您構造這樣的值。

BLOB

Blob

Oracle 只允許將 BLOB 繫結為 BLOB 引數。 如果您嘗試繫結一個非 BLOB 值(如 byte[]),適用於 Oracle 的 .NET 資料提供程式並不會自動為您構造這樣的值。

CHAR

AnsiStringFixedLength

Char

CLOB

Clob

Oracle 只允許將 CLOB 繫結為 CLOB 引數。 如果您嘗試繫結一個非 CLOB 值(如 System.String),適用於 Oracle 的 .NET 資料提供程式並不會自動為您構造這樣的值。

DATE

DateTime

DateTime

FLOAT

Single、Double、Decimal

Float、Double、Number

確定 System.Data.DBType

INTEGER

SByte、Int16、Int32、Int64、Decimal

SByte、Int16、Int32、Number

確定 System.Data.DBType

INTERVAL YEAR TO MONTH

Int32

IntervalYearToMonth

只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。

INTERVAL DAY TO SECOND

Object

IntervalDayToSecond

只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。

LONG

AnsiString

LongVarChar

LONG RAW

Binary

LongRaw

NCHAR

StringFixedLength

NChar

NCLOB

NClob

Oracle 只允許將 NCLOB 繫結為 NCLOB 引數。 如果您嘗試繫結一個非 NCLOB 值(如System.String),適用於 Oracle 的 NET 資料提供程式並不會自動為您構造這樣的值。

NUMBER

VarNumeric

Number

NVARCHAR2

String

NVarChar

RAW

Binary

Raw

REF CURSOR

Cursor

有關更多資訊,請參見

ROWID

AnsiString

Rowid

TIMESTAMP

DateTime

Timestamp

只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。

TIMESTAMP WITH LOCAL TIME ZONE

DateTime

TimestampLocal

只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。

TIMESTAMP WITH TIME ZONE

DateTime

TimestampWithTz

只有在同時使用 Oracle 9i 客戶端和伺服器軟體時, 才可用。

UNSIGNED INTEGER

Byte、UInt16、UInt32、UInt64、Decimal

Byte、UInt16、Uint32、Number

確定 System.Data.DBType

VARCHAR2

AnsiString

VarChar

物件的 屬性使用的 InputOutputOutputReturnValue ParameterDirection 值為 .NET Framework 資料型別,除非輸入值是 Oracle 資料型別(例如 )。這並不適用於 REF CURSORBFILELOB 資料型別

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/73920/viewspace-1028193/,如需轉載,請註明出處,否則將追究法律責任。

相關文章