【问题标题】:C#/Oracle10g = null vs DBNull.Value vs String.EmptyC#/Oracle10g = null vs DBNull.Value vs String.Empty
【发布时间】:2015-11-03 19:11:03
【问题描述】:

我第一次尝试从 C# 访问 Oracle。我发现 Oracle 不喜欢 VarChar 参数的值为 null (C#)。我本来希望会有一些隐式转换,但我很欣赏其中的不同。

所以我需要捕获这些空值并提供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 特性?

【问题讨论】:

    标签: c# oracle ado.net null dbnull


    【解决方案1】:

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

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

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

    【讨论】:

    • 感谢您的回答 James,但您只是在重复我的学习之旅……但是恕我直言,从 C# null 推断 DB NULL 比从推断 DB NULL 更有意义一个空字符串。不过,我有两种替代解决方案;问题是哪个更好(重要吗?),还有其他选择。
    • 嗯...这听起来有点太挑剔了,但它不是故意的。我只是说我当时在描述我的思路,我意识到 String != System.DBNull.
    【解决方案2】:

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

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

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

    【讨论】:

    • 我不能说我已经对它进行了详尽的测试(尽管我在测试它时已经筋疲力尽了!),但 String.Empty 似乎确实有效。我不确定它应该,请注意....
    • String.Empty 将起作用,因为 .NET 将传递一个空字符串作为值,而 Oracle 将空字符串视为 NULL。也就是说,'' IS NULL 在 SQL Server 中为假,但在 Oracle 中为真。
    • @stevemegson 和 @CJM 我错过了你的问题中你所说的 String.Empty 也有效的那一行,这让我对你的问题的其他理解产生了影响。
    【解决方案3】:

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

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

    【讨论】:

    • 我的同事控制着数据库,所以这同样可能,谢谢。
    猜你喜欢
    • 2016-05-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 2011-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多