null 値を oracle 11g odp.net ドライバーと比較する際に問題が発生しています。Oracle 10g odp.net ドライバーで問題なく動作します。データベースで列が null の場合、データ行には文字列値null
.
このコードは失敗します:
int parentId = row[PARENTID] != DBNull.Value ? int.Parse(row[PARENTID].ToString()) : 0;
ありがとう
これは、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
}
ここ :
var para6 = new OracleParameter("pOrganizationParentId", OracleDbType.Long){
IsNullable = true,
};
if (string.IsNullOrEmpty(organizationParentId)) {
para6.Value = null;
} else {
para6.Value = long.Parse(organizationParentId);
}
Oracleのドキュメントから:
値が DbType の場合、param.Value==DbNull.Value を確認できます。
値が OracleDbType の場合、((INullable)param.Value).IsNull を確認できます。これは、Oracle 型が INullable インターフェイスを継承しているためです。