4

私は、C# からの Oracle へのアクセスに初めて取り組んでいます。私は、Oracle が(C#)VarCharの値を持つパラメーターを好まないことを発見しました。null暗黙の変換があることを望んでいましたが、その違いに感謝しています。

したがって、これらの null 値をトラップしてDBNull.Value代わりに供給する必要がありますか? 最も明白な方法は、合体演算子を使用することでした??:

param myParm = myObject.MyProperty ?? DBNull.Value;

System.DBNull...の値を受け入れないことを除いて、次を使用する必要があります。

param myParm = myObject.MyProperty ?? DBNull.Value.ToString();

...これは確かに次と同じです:

param myParm = myObject.MyProperty ?? String.Empty;

..これも機能します。

しかし、ANSI SQL 規則によれば、空の文字列 ("") != NULL 値であることは常に理解していましたが、Oracle にはあるようです。

とにかく、私の質問は、null 文字列値のケースを処理するための、実用的または理論的な最善の方法は何ですか? 私が特定していない巧妙な代替手段はありますか? それとも、これは私たちが受け入れているオラクルの別の特異性ですか?

4

3 に答える 3

3

空の文字列 ("") は、実際には NULL 値と等しくない場合はそうしますが、それは NULL が何とも等しくない (別の NULL でさえも) ためです (これがIS NULL、SQL ステートメントで= NULL.

NULL は「値なし」を意味し、空の文字列には値がないため、Oracle の設計者は空の文字列と NULL の間に違いはないと判断しました。

param myParm = myObject.MyProperty ?? DBNull.Value;の両側が??同じタイプでなければならないため、失敗します。 は文字列、はオブジェクトMyPropertyであると仮定します。DBNull.ValueDBNull

于 2010-08-17T14:12:40.663 に答える
1

は機能せず、null値では機能し??ないため、ここにははるかに簡単な解決策があります。String.Empty

param myParm;

if (myObject.MyProperty == null)
{
   myParm  = DBNull.Value;
}
else 
{
   myParm = myObject.MyProperty;
}

nullコアレッサーほど「滑らか」ではないかもしれませんが、機能するはずです。

于 2010-08-17T14:16:55.303 に答える
1

値を に設定するとnull、.NET は生成された SQL でパラメーターをまったく指定しません。NULLしたがって、1 つのオプションは、Oracle でパラメータのデフォルト値を指定することです。つまり、値をnullまたはに設定するDBNull.Valueと、同じ効果が得られます。1 つは値を渡さずNULLに想定されますが、もう 1 つは明示的に の値を渡しますNULL

明らかに、データベースを変更できること、およびそのパラメーターに別のデフォルト値をまだ必要としないことを前提としています。

于 2010-08-17T14:26:12.140 に答える