C # / Oracle10g = ноль против DBNull.Value против String.Empty - PullRequest
4 голосов
/ 17 августа 2010

Я делаю свои первые набеги на Доступ к Oracle из C #.Я обнаружил, что Oracle не любит, чтобы VarChar параметры имели значение null (C #).Я бы надеялся, что будет какое-то неявное преобразование, но я ценю разницу.

Так что мне нужно перехватить эти нулевые значения и вместо этого предоставить DBNull.Value, конечно?Наиболее очевидным методом было использование оператора coalesce ??:

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.

В любом случае, мой вопрос: каков наилучший, практический или теоретический способ обработки случая значений нулевых строк?Есть ли альтернатива, которую я не нашел?Или это просто еще одна особенность Oracle, которую мы просто принимаем?

Ответы [ 3 ]

3 голосов
/ 17 августа 2010

Пустая строка ("") имеет значение, если факт НЕ равен значению NULL, но это потому, что NULL ничем не равен (даже не другому NULL) (вот почему вместо этого вы говорите IS NULL в выражении SQL = NULL.

NULL означает «Нет значения», а пустая строка не имеет значения, поэтому разработчики Oracle решили, что нет разницы между пустой строкой и NULL.

param myParm = myObject.MyProperty ?? DBNull.Value; терпит неудачу, потому что обе стороны ?? должны быть одного типа. MyProperty Я предполагаю, что это строка, а DBNull.Value это DBNull объект.

1 голос
/ 17 августа 2010

Если вы установите значение null, .NET вообще не будет указывать параметр в сгенерированном SQL.Поэтому одним из вариантов является указание значения по умолчанию NULL для параметра в Oracle.Это означает, что установка значения null или DBNull.Value имеет тот же эффект.Один не передает значения, и NULL будет приниматься, в то время как другой явно передает значение NULL.

Очевидно, это предполагает, что вы можете изменить базу данных, и что вам уже не нужна другаязначение по умолчанию для этого параметра.

1 голос
/ 17 августа 2010

Здесь есть гораздо более простое решение, так как ?? не будет работать и String.Empty не будет работать для вашего нулевого значения.

param myParm;

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

Это может быть не так гладко, как ноль-коагулятор, но он должен работать.

...