在應用.Net 2.0 串連Oracle的時候遇到了問題:
1.1時代都是直接Using System.Data.OracleClient,.Net 2.0改進成使用DBProvider(System.Data.Common)的方式,
看起來很美,但是用到Oracle預存程序返回結果集的時候愣住了
DBType沒有支援Cursor的類型?!查了資料半天也沒有結果
如果實在沒辦法只好回到System.Data.OracleClient了
.NET Framework Data Provider for Oracle
Oracle type |
.NET Framework type |
.NET Framework typed accessor |
OracleType typed accessor |
BFILE |
Byte[] |
GetBytes() |
GetOracleBFile() |
BLOB |
Byte[] |
GetBytes() |
GetOracleLob() |
CHAR |
String Char[] |
GetString() GetChars() |
GetOracleString() |
CLOB |
String Char[] |
GetString() GetChars() |
GetOracleLob() |
DATE |
DateTime |
GetDateTime() |
GetOracleDateTime() |
FLOAT |
Decimal |
GetDecimal() |
GetOracleNumber() ** |
INTEGER |
Decimal |
GetDecimal() |
GetOracleNumber() ** |
INTERVAL YEAR TO MONTH * |
Int32 |
GetInt32() |
GetOracleMonthSpan() |
INTERVAL DAY TO SECOND * |
TimeSpan |
GetTimeSpan() |
GetOracleTimeSpan() |
LONG |
String Char[] |
GetString() GetChars() |
GetOracleString() |
LONG RAW |
Byte[] |
GetBytes() |
GetOracleBinary() |
NCHAR |
String Char[] |
GetString() GetChars() |
GetOracleString() |
NCLOB |
String Char[] |
GetString() GetChars() |
GetOracleLob() |
NUMBER |
Decimal |
GetDecimal() |
GetOracleNumber() ** |
NVARCHAR2 |
String Char[] |
GetString() GetChars() |
GetOracleString() |
RAW |
Byte[] |
GetBytes() |
GetOracleBinary() |
REF CURSOR |
|
|
|
ROWID |
String Char[] |
GetString() GetChars() |
GetOracleString() |
TIMESTAMP * |
DateTime |
GetDateTime() |
GetOracleDateTime() |
TIMESTAMP WITH LOCAL TIME ZONE * |
DateTime |
GetDateTime() |
GetOracleDateTime() |
TIMESTAMP WITH TIME ZONE * |
DateTime |
GetDateTime() |
GetOracleDateTime() |
UNSIGNED INTEGER |
Decimal |
GetDecimal() |
GetOracleNumber() ** |
VARCHAR2 |
String Char[] |
GetString() GetChars() |
GetOracleString() |
問題最終用一下的方式解決:
DbParameter param = dpfProvider.CreateParameter();
if (sourceColumn == ORACLE_REF_CURSOR)
{
OracleParameter op = new OracleParameter();
op.OracleType = OracleType.Cursor;
param = op;
}
雖然看起來有點不倫不類,但是能運行,而且支援多個Oracle Ref Cursor