2012-02-02 13 views
2

oracle11g odp.netドライバとのヌル値の比較に問題があります。これは、オラクル10g odp.netドライバで正常に動作します。列がデータベース内でNULLの場合、datarowの列の値はnullです。Oracle 11g odp.netドライバのNull値に問題が発生する

このコードは失敗します。

int parentId = row[PARENTID] != DBNull.Value ? int.Parse(row[PARENTID].ToString()) : 0; 

おかげ

+0

ハウズコードが失敗していますか? (失敗し、期待されていない作業が少し異なるケース...) –

+0

私が意味するのは、行[PARENTID]の値は.ToString = "null"ではなく "null"です。だから、整数として解析しようとします。私は例外を得る。 "入力文字列が正しい形式ではありません" –

+0

'行[PARENTID]'の種類は何ですか?それが 'string'または' object'で、値*が本当にnull *の場合、それはNullReferenceException(*誰かが拡張メソッドでsnuckしていない限り)をスローします。おそらく、格納されるデータは*文字列「null」ですか? (またはアダプタに壊れているものやフラグがあります) –

答えて

1

var para6 = new OracleParameter("pOrganizationParentId", OracleDbType.Long){ 
    IsNullable = true, 
}; 

if (string.IsNullOrEmpty(organizationParentId)) { 
    para6.Value = null; 
} else { 
    para6.Value = long.Parse(organizationParentId); 
} 
5

これはORacle11gとは何かを持っています。 あなたが言ったように、実際のヌル値の代わりに、ヌル文字列です。 そんなに以下INullableから両方の継承は、私の解決策だったのOracleDbType、OracleDbTypeのとCLRデータ型にNULLからチェックしている場合:

((INullable)rowParamDBType.Value)が持っているために

を.IsNullよりクリーンなソリューションであれば、これをエクステンションに配置できます。

行がDbTypeの場合、param.Value == DbNull.Valueを確認できます。


以上があまりにも動作しますが、この問題の真の解決策は、あなたのOracleParameter宣言で代わりのOracleDbTypeのOracleDbTypeExを使用しています。 OracleDbTypeExは値をDBTypeに戻します。このため、DBNullを認識します。以下のサンプルコードを参照してください。

command.Parameters.Add(new OracleParameter 
          { 
           ParameterName = "param_out", 
           OracleDbTypeEx = OracleDbType.Decimal, 
           Direction = ParameterDirection.Output 
          }); 

if (command.Parameters["param_out"].Value != Convert.DBNull) 
{ 
    //your code here 
} 
2

フロムOracleのドキュメント:値F

がDbTypeのある、あなたはparam.Value == DBNull.Valueの

をチェックすることができる値がOracleDbTypeの場合は、のために確認することができます((INullable)param.Value).IsNull型はINullableインターフェイスを継承しているためです。ここで

関連する問題