Oracle.DataAccess.Client(11g)を使用して、ストアドプロシージャを含むOracleデータベースで特定の操作を実行するアプリをC#で作成しています。 Oracleデータ型を含む特定の列挙型(OracleDbType)があることは知っていますが、特定の型にどれを使用するかわかりません。
OracleDbType列挙型の列挙型ごとに、同等のOracle PL/SQLデータ型とは何ですか?
整数には3つのタイプがあります
(Int16、Int32、Int64)in OracleDbType ...どれを使用するか、またはそれらすべてを知る方法
働くと思いますか?
OracleDbType Enumerationの値は、ドキュメントで定義されています。 ODP for .NET開発者ガイド をお読みください。
Int16、Int32、Int64のいずれかを選択することに関しては、それらはすべて動作するはずです。 .Net変数の予想サイズに一致するものを選択します。-32768〜32767の値の場合はInt16、-2147483648〜2147483647の値の場合はInt32、それより大きい値の場合はInt64を選択します。 IntおよびPL/SQLデータ型の変換に関連するいくつかの面白いことがあるようです。チェック Mark Williamsによるこのブログ投稿 。
C#の型を最も一般的なOracleDbTypeに変換する方法は次のとおりです
private static OracleDbType GetOracleDbType(object o)
{
if (o is string) return OracleDbType.Varchar2;
if (o is DateTime) return OracleDbType.Date;
if (o is Int64) return OracleDbType.Int64;
if (o is Int32) return OracleDbType.Int32;
if (o is Int16) return OracleDbType.Int16;
if (o is sbyte) return OracleDbType.Byte;
if (o is byte) return OracleDbType.Int16; -- <== unverified
if (o is decimal) return OracleDbType.Decimal;
if (o is float) return OracleDbType.Single;
if (o is double) return OracleDbType.Double;
if (o is byte[]) return OracleDbType.Blob;
return OracleDbType.Varchar2;
}
また、文字データの値が非常に大きい場合は、OracleDbType.Clob
。
チェック APCのリンク アウト、それらはあなたが探しているものです:マッピングは列挙の名前に従って非常に簡単です。
しかし、気づき始めたように、整数には注意が必要です。これが私のマッピングです:
Int16
_:NUMBER(5)
。Int32
_:NUMBER(10)
。Int64
_:NUMBER(19)
。問題は、NUMBER(38)
列で _GetInt64
_ を呼び出すと、値が正しい範囲内であっても例外が発生することです...
NUMBER(1,0)=>ブール
NUMBER(5,0)=> Int16.MaxValue == 32767
NUMBER(10,0)=> Int32.MaxValue == 2,147,483,647
NUMBER(19,0)=> Int64.MaxValue == 9,223,372,036,854,775,807
NUMBER(19,0)=> long.MaxValue == 9,223,372,036,854,775,807
浮動小数点に相当するものを知りたい人のために:
Decimal Oracle NUMBER type
Double 8-byte FLOAT type
OracleでNumberを使用した場合、10進数が適しています。
APCが指摘したとおり: https://docs.Oracle.com/cd/B19306_01/win.102/b14307/OracleDbTypeEnumerationType.htm