.NET 2.0 可空类型和数据库空思考

发布于 2024-07-15 04:23:08 字数 165 浏览 5 评论 0原文

如果 .NET 2.0 从版本 1 开始就存在可空类型,那么首先就不需要 DBNull.Value 了吗?

或者 RDBMS 的 null 与 .NET 的 null 没有关系? 也就是说,无论如何 .NET 版本 1 已经具有可为 null 的类型,DBNull.Value 仍然是需要的。

If .NET 2.0 nullable types was there from version 1, will DBNull.Value not be needed in the first place?

Or RDBMS's null has no bearing with .NET's null? That is DBNull.Value will still be needed anyhow, regardless of .NET version 1 already have nullable types.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

尤怨 2024-07-22 04:23:08

.NET 中的可空类型允许相关变量实际上为空。 DBNull 是一种表达“在另一个环境中,该值被认为是 null”的方式。 由于我们需要一种方法来区分实际上 null - 或“本机” null,如我们当前运行时本机的 null - 和我们与之通信的另一个系统中的 null,因此可空类型和 DBNull 具有完全不同的用途。

Nullable types in .NET allow the variable in question to actually be null. DBNull is a way to say "in another environment, this value was considered to be null". Since we need a way do differentiate between actually null - or "natively" null, as in native to our current runtime - and null in another system we communicate with, nullable types and DBNull serve completely different purposes.

慕烟庭风 2024-07-22 04:23:08

nullDBNull。在任何 .NET 版本中,值都是两个不同的东西。

例如:

public string CustomerName(int Id)
{
   SqlCommand cmd = 
         new SqlCommand("SELECT Name FROM Customer WHERE id = " + custId, conn);

   object result = cmd.ExecuteScalar();

   if (result == null)
      return "Customer not found";

   if (result == System.DBNull.Value)
      return "Customer found but name is null";

   return (string) result;
}

参考

null and DBNull.Value are two different things in any .NET version.

For example:

public string CustomerName(int Id)
{
   SqlCommand cmd = 
         new SqlCommand("SELECT Name FROM Customer WHERE id = " + custId, conn);

   object result = cmd.ExecuteScalar();

   if (result == null)
      return "Customer not found";

   if (result == System.DBNull.Value)
      return "Customer found but name is null";

   return (string) result;
}

Ref.

回心转意 2024-07-22 04:23:08

如果 System.Data.DataSetExtensions.dll 是可以遵循的,我猜测如果当时可以为 null 的值类型可用,那么 DBNull.Value 可能不会存在。

在将“foo”列设置为 DBNull.Value 的 DataRow 上使用该库的扩展方法,您会得到...

row.Field<int?>("foo");  // returns a nullable int set to null
row.Field<int>("foo");   // throws an InvalidCastException

当然,与 C# 结合使用时,这是非常方便的? 运算符,当您想要提供默认值来代替数据库 null 时。 就我个人而言,我没有浪费时间在 IDataReader/IDataRecord 上实现类似的扩展方法。

If System.Data.DataSetExtensions.dll is anything to go by, I'm guessing that DBNull.Value probably wouldn't exist if nullable value types had been available at the time.

Using that library's extension methods on a DataRow that has a "foo" column set to DBNull.Value, you get...

row.Field<int?>("foo");  // returns a nullable int set to null
row.Field<int>("foo");   // throws an InvalidCastException

This is, of course, incredibly convenient when combined with the C# ?? operator, when you want to provide a default value in place of a database null. Personally, I wasted no time implementing similar extension methods on IDataReader/IDataRecord.

蹲墙角沉默 2024-07-22 04:23:08

我不太同意这一点。

.NET 中的可空类型允许
有问题的变量实际上是
无效的。 DBNull 是一种表达“在
另一个环境,这个值是
被认为是 null”。因为我们需要
一种区分的方法
实际上为 null - 或“本机”为 null,如
在我们当前运行时的本机中 - 并且
在我们通信的另一个系统中为 null
with、可空类型和 DBNull 服务
完全不同的目的。

仅当您不知道局部变量是否已从数据库中获取时才需要进行这种区分。 如果您知道该变量已从数据库中获取,则可以识别 null 和 DBNull。

但不同之处在于,编程语言中的 null 表示没有值,而 null == null 则为 true。 在数据库中,null 表示更像是未知值。 因此 null == null 在数据库中是 false; null 根本不等于任何东西,因为您无法判断一个未知值是否等于另一个未知值。 我不确定 DBNull 是否以这种方式实现,并且 DBNull.Value == DBNull.Value 的计算结果为 false。

编辑

我刚刚测试了它,DBNull 的行为并不像预期的那样。 DBNull.Value == DBNull.Value 计算结果为 true,但根据数据库 null 的语义应产生 false。

I do not really agree to this.

Nullable types in .NET allow the
variable in question to actually be
null. DBNull is a way to say "in
another environment, this value was
considered to be null". Since we need
a way do differentiate between
actually null - or "natively" null, as
in native to our current runtime - and
null in another system we communicate
with, nullable types and DBNull serve
completely different purposes.

This distinction is only required if you do not know if your local variable has allready been fetched from the database. If you know that the variable has been fetched from the database it would be okay to identify null and DBNull.

But the difference is that null in programming languages signals the absence of a value and null == null is true. In databases the null indicates something more like an unknown value. Therefore null == null is false in databases; null equals nothing at all because you cannot tell for an unknown value if it equals another unknown value. I am not sure if DBNull is implemented this way and DBNull.Value == DBNull.Value evaluates to false.

EDIT

I just tested it and DBNull does not behave as exspected. DBNull.Value == DBNull.Value evaluates to true but should yield false with the semantic of the database null.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文