4

我第一次尝试从 C# 访问 Oracle。我发现 Oracle 不喜欢具有(C#)VarChar值的参数。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 中。

无论如何,我的问题是,处理空字符串值的最佳、实用或理论上的方法是什么?有没有我没有确定的巧妙替代方案?或者这只是我们接受的另一个 Oracle 特性?

4

3 回答 3

3

如果事实不等于 NULL 值,则空字符串 ("") 确实如此,但那是因为 NULL 不等于任何值(甚至不等于另一个 NULL)(这就是为什么您IS NULL在 SQL 语句中说而不是= NULL.

NULL 表示“No Value”,空字符串没有任何值,所以 Oracle 的设计者认为空字符串和 NULL 没有区别。

param myParm = myObject.MyProperty ?? DBNull.Value;失败,因为双方??必须是相同的类型。 MyProperty我假设是一个字符串,DBNull.Value而是一个DBNull对象。

于 2010-08-17T14:12:40.663 回答
1

这里有一个更简单的解决方案,因为它??不起作用并且String.Empty不适用于您的 null 值。

param myParm;

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

它可能不像 null-coalescer 那样“光滑”,但它应该可以工作。

于 2010-08-17T14:16:55.303 回答
1

如果将该值设置为null,.NET 将根本不会在生成的 SQL 中指定参数。NULL因此,一种选择是为Oracle 中的参数指定默认值。这意味着将值设置为nullDBNull.Value具有相同的效果。一个不传递任何值NULL并将被假定,而另一个显式传递一个值NULL

显然,这假设您可以修改数据库,并且您不需要该参数的不同默认值。

于 2010-08-17T14:26:12.140 回答