我第一次尝试从 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 特质?

最佳答案

如果事实不等于 NULL 值,则空字符串 ("") 确实如此,但这是因为 NULL 不等于任何内容(甚至不等于另一个 NULL)(这就是您在 SQL 语句中使用 IS NULL 而不是 = NULL 的原因。

NULL 的意思是“No Value”,空的字符串没有值,所以 Oracle 的设计者认为空字符串和 NULL 没有区别。
param myParm = myObject.MyProperty ?? DBNull.Value; 失败,因为 ?? 的两边必须是相同的类型。我假设 MyProperty 是一个字符串,而 DBNull.Value 是一个 DBNull 对象。

关于C#/Oracle10g = null vs DBNull.Value vs String.Empty,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3503237/

10-12 17:24