问题标签 [dbnull]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
4 回答
15149 浏览

c# - C# 数据库访问:DBNull 与 null

我们在这里使用自己的 ORM,并为我们所有的数据库表提供强类型包装器。我们还允许执行弱类型的 ad-hoc SQL,但这些查询仍然通过同一个类从数据读取器中获取值。

在调整该类以使用 Oracle 时,我们遇到了一个有趣的问题。使用 DBNull.Value 还是 null 更好?使用 DBNull.Value 有什么好处吗?使用 null 似乎更“正确”,因为我们已经将自己与 DB 世界分开了,但是有一些影响(例如,当值为 null 时,你不能盲目地ToString())所以它绝对是我们需要意识到的关于的决定。

0 投票
6 回答
5444 浏览

.net - (any == System.DBNull.Value) vs (any is System.DBNull)

有没有人对如何检查一个值是否有偏好DBNull?我发现这两个陈述给了我想要的结果,但只是想知道是否有偏好?

if (any is System.DBNull)

如同:

if (any == System.DBNull.Value)

谢谢!

0 投票
6 回答
15201 浏览

.net - .NET DBNull 与所有变量类型都没有?

我对 .NET 中的空值和变量有点困惑。(首选VB)

有没有办法检查任何给定变量的“nullness”,无论它是对象还是值类型?还是我的空检查必须始终预测它是检查值类型(例如 System.Integer)还是对象?

我想我正在寻找的是一个检查所有可能的空值的函数。也就是说,任何类型的变量

a) 自声明以来从未被赋值

b)从数据对象(来自数据库)中分配了一个空值

c) 被设置为等于另一个为空的变量值

d) 设置为从未设置或过期的 ASP.NET 会话/应用程序变量。

在 .NET 中处理空场景时是否有一般的最佳实践?

更新:当我谈论一个值类型为“null”时,我真正的意思是一个值类型,它要么从未设置,要么在某些时候设置为等于或从空对象强制转换。

0 投票
3 回答
13119 浏览

c# - 为什么这段代码在 C# 中无效?

以下代码将无法编译:

我得到:错误 1 ​​条件表达式的类型无法确定,因为 'System.DBNull' 和 'string' 之间没有隐式转换

要解决此问题,我必须执行以下操作:

这个演员表似乎毫无意义,因为这当然是合法的:

在我看来,当三元分支是不同类型时,编译器不会将值自动装箱到类型对象......但是当它们是相同类型时,自动装箱是自动的。

在我看来,第一个声明应该是合法的......

谁能描述为什么编译器不允许这样做以及为什么 C# 的设计者选择这样做?我相信这在 Java 中是合法的......虽然我还没有验证这一点。

谢谢。

编辑:我要求了解为什么 Java 和 C# 以不同的方式处理这个问题,C# 中的幕后发生了什么使这无效。我知道如何使用三元,并且不是在寻找一种“更好的方式”来编写示例。我了解 C# 中三进制的规则,但我想知道为什么...

编辑(乔恩斯基特):删除“自动装箱”标签,因为此问题不涉及装箱。

0 投票
6 回答
34316 浏览

c# - C# ADO.NET:null 和 DbNull——有更高效的语法吗?

我有一个DateTime?我正在尝试使用DbParameter. 我正在像这样创建参数:

然后我想把 s 的值DateTime?放入dataPrm.Valuewhile 占nulls。

起初我以为我会很聪明:

但这因错误而失败

操作员 '??' 不能应用于“System.DateTime?”类型的操作数?和'System.DBNull'

所以我猜这只有在第二个参数是第一个参数的不可空版本时才有效。所以我去了:

但这也不起作用:

无法确定条件表达式的类型,因为 'System.DateTime' 和 'System.DBNull' 之间没有隐式转换

但我不想在这些类型之间进行转换!

到目前为止,我唯一可以开始工作的是:

这真的是我写这篇文章的唯一方法吗?有没有办法让使用三元运算符的单线工作?

更新:我真的不明白为什么?版本不起作用。MSDN 说:

这 ??运算符如果不为空则返回左操作数,否则返回右操作数。

这正是我想要的!

Update2:嗯,最后很明显:

0 投票
15 回答
172485 浏览

.net - 检查 DBNull 然后分配给变量的最有效方法是什么?

这个问题偶尔会出现,但我还没有看到满意的答案。

一个典型的模式是(行是一个DataRow):

我的第一个问题是哪个更有效(我已经改变了条件):

表明 .GetType() 应该更快,但也许编译器知道一些我不知道的技巧?

第二个问题,是否值得缓存 row["value"] 的值,或者编译器是否优化了索引器?

例如:

笔记:

  1. 行[“值”] 存在。
  2. 我不知道列的列索引(因此是列名查找)。
  3. 我特别询问是否检查 DBNull 然后分配(不是关于过早优化等)。

我对几个场景进行了基准测试(以秒为单位的时间,10,000,000 次试验):

Object.ReferenceEquals 与 "==" 具有相同的性能

最有趣的结果?如果您按大小写不匹配列的名称(例如,“Value”而不是“value”,则大约需要十倍的时间(对于字符串):

这个故事的寓意似乎是,如果您不能通过索引查找列,那么请确保您提供给索引器的列名称与 DataColumn 的名称完全匹配。

缓存值似乎也快了近两倍

所以最有效的方法似乎是:

0 投票
13 回答
258259 浏览

vb.net - 在 vb.net 中处理 dbnull 数据

我想生成一些从 MS-Access 数据库中检索并存储在DataTable对象/变量 myDataTable 中的数据的格式化输出。但是,myDataTable 中的某些字段包含dbNull数据。因此,如果任何字段lastnameintialssID的值为dbNull,则以下 VB.net 代码片段将给出错误。

那么,当字段可能包含dbNull时,我如何让上面的代码工作,而不必每次都检查数据是否为 ​​dbNull ,就像这个问题一样?

0 投票
2 回答
969 浏览

c# - POCO 对象中的非空约束

我目前正在编写一个财务应用程序,我们有一个非常标准的客户表。它由许多必填字段和一些可选字段组成,例如 Cell/Fax 等。我使用 NHibernate 作为 ORM 并且所有映射都正确。它已经起作用了。

我只是想知道,我如何在代码中“表达”一个字段不为空而不注释?我有记录这个的 hbm.xml 文件,但是对于这样的事情来看它们有点尴尬。

想到的另一件事是我不希望存储库在我的逻辑上抛出 NHibernate 异常,所以也许我应该在控制器中进行验证。不过,我怎样才能让 POCO 代码表达某些字段可以为空?

类图

如您所见,我希望蜂窝和传真是可选的,而电话是必需的。它们都只是复合映射,所以映射文件只是指定每个元素的单个元素必须不为空,但我讨厌一直执行 Person.Cellular != null 检查以避免出现 NullReferenceException。

0 投票
6 回答
4389 浏览

c# - 处理 SQL 数据库中的 null int/char 的最佳做法是什么?

我有一个保存用户可选配置文件的数据库。在配置文件中,我有字符串、char(用于 M 或 F)和 int。

我遇到了一个问题,我尝试将用户的性别放入我的 Profile 对象的属性中,并且应用程序崩溃了,因为它不知道如何处理返回的空值。

我已经尝试将数据转换为适当的类型

这并没有解决我的问题。然后我尝试将类型更改为 Nullable 和 Nullable 并得到相同的转换问题。我目前能够找到的解决方案如下:

有没有更简单或更好的方法来做到这一点?还是我几乎走在正确的轨道上?

0 投票
2 回答
1696 浏览

.net - 如何在我的 XSD 数据集中处理 DBNull 到布尔值的转换?

在我的数据库中,我的一个表中有几列是位(布尔)值。它们被允许为 NULL,因为这些字段并不总是包含数据。

我已经完成了使用该表创建 XSD 数据集的过程,并确保将 AllowDBNull 字段设置为 True。

但是,当我使用配置的 GetData 方法将数据库中的一条记录拉到数据表中时,我遇到了以下错误:

我是否需要在列的 DefaultValue 字段中指定其他内容,或者是否需要设置其他字段?

我仍处于这个项目的开发阶段,所以如果将字段更改为 char 并首选使用 Y/N/NULL 选项,我不会太反对这种方式。