2

null 値を oracle 11g odp.net ドライバーと比較する際に問題が発生しています。Oracle 10g odp.net ドライバーで問題なく動作します。データベースで列が null の場合、データ行には文字列値null.

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

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

ありがとう

4

3 に答える 3

5

これは、ORAcle11g と関係があります。あなたが言ったように、実際の null 値ではなく、null 文字列です。OracleDbType からチェックしている場合、OracleDbType と CLR Datatype の null は両方とも INullable から継承されるため、以下が私の解決策でした。

((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
}
于 2012-02-08T20:43:07.420 に答える
4

ここ :

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

if (string.IsNullOrEmpty(organizationParentId)) {
    para6.Value = null; 
} else {
    para6.Value = long.Parse(organizationParentId);
}
于 2012-08-23T10:08:33.773 に答える
3

Oracleのドキュメントから:

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

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

于 2012-02-08T20:53:58.997 に答える