2011-02-02 3 views
2

OracleDataReaderOracle.DataAccess.Client)をac#プログラムで使用してレコードセットからデータを読み取ると、いずれかのフィールドのデータ型が行から行(DBNullを除く)。OracleDatareader使用時にフィールド・データ型を行から列に変更することができます

私は、selectが数値(9)である列の値または数値(14)として定義された列の値を返すことができるcase文を使用するような状況を考えています。

データリーダーでインデクサーを使用しているときに返される値をアップキャストするときに関連する可能性のあるその他の問題がありますか? int cityId = (int)dataReader["CityId"];(DBNullの処理を除く)

答えて

0

結果セットの各列は、同じデータ型と長さ/サイズ/精度を持ちます。 JDBC接続

JDBCを使用すると、実際にはresult set metadataから取得できます。 C#に相当するものがあるかどうかわからない

奇妙は、SYS.ANYTYPEと呼ばれる非常に特殊なユーザー定義型で、主にレプリケーションのために内部的に使用されます。 1つの列を持つ結果セットに3つの行を含めることができます。列のデータ型はSYS.ANYTYPEですが、内部的には日付値を持ち、別のものは数値で、最後には文字があります。 ANYTYPE値の中に何が隠されているかを判別するための特別なパッケージがあります。

1

AFAIK、データ型は行単位で変更されません。

異なるデータ型の値を返すcase文をクエリが使用する場合、エンジンはすべての値を保持するために最も適切な値を選択し、そのデータ型を使用する結果セットをすべての結果セットの列ごとに1つのデータ型を使用するように指定します。

とにかく、クエリのソースを信頼できない場合は、キャストをtry/catch文で囲み、予期しない結果を得てそれに応じて処理してください。

+0

行ごとにデータ型が変化しないのは、一般的に私が思ったことです。しかし、ヌルになる可能性のある数字(9)を考えてみましょう。ある行の値は、その行のデータ型がintになるように.netに設定されます。別の行の場合、値はNULLであり、その行のデータ型はSystem.DBNullになります。したがって、.net側のdbから来る値の表現は、異なるデータ型intまたはDBNullを持つことができます。だから技術的にデータ型がintまたはDBNullのいずれかになりうるのであれば、技術的には別のものになる可能性もあります。 –

+1

@Phil Carson - あなたはここで '値'と 'タイプ'を混同していると思います。特定の行がその列の値に対してNULLを戻すとき、それは値です - 列は型を変更しませんでした。行が特定の列に対して9を返すのと同じように、型ではなく値を戻します。列はINTまたはSMALLINT、またはBIGINTですが、値は9です。同様に、*値*はNULLでもかまいませんが、列はその型を保持します。 .NETは、値をCLR型にマップするために、いくつかの "under the hood"の作業を実行し、NULL値用の特別なロジックを持っています。これは混乱の原因となっている可能性があります。 – JeremyDWill

関連する問題