在使用 VB.NET 的 Access 中将空字符串字段插入为 null

Posted

技术标签:

【中文标题】在使用 VB.NET 的 Access 中将空字符串字段插入为 null【英文标题】:Inserting empty string field as null in Access with VB.NET 【发布时间】:2012-01-04 01:16:38 【问题描述】:

我在 Windows 表单中有几个文本字段。这些文本字段之一允许为 NULL。当我为每个字段输入一个值时,它都被插入,没问题。当我将字段 (txtGewicht) 留空时,我似乎无法在 Access 数据库中插入 NULL。

    If Double.TryParse(txtGewicht.Text, 0) Then
      klant.Gewicht = Double.Parse(txtGewicht.Text)
    Else
      klant.Gewicht = Nothing
    End If

这是我得到的:

"无法将列 'Gewicht' 设置为 NULL,请改用 DBNull"

所以我将“Nothing”更改为 DBNull.value,但它告诉我 System.DBNull 无法转换为 Double 类型。

【问题讨论】:

【参考方案1】:

Double 是值类型 - 不是引用类型。因此,默认情况下它不可为空。

如果 klant.Gewicht 是这样声明的:

Public Property Gewicht as Double

那么就命令生成器而言,它永远不会是“null”。

甚至明确地说:

d = nothing

没有效果,还是0.0

您可以尝试将您的属性实现为 Nullable(of Double)。

这将允许该属性被视为“空”。我不确定 CommandBuilder 是否会自动处理这个问题,但这是一个开始。

另外 - 我发现你的 Double.TryParse 方法很有趣。第二个参数的重点是将解析的结果(如果成功)存储到。

您的代码可以缩短为:

If Not Double.TryParse(txtGewicht.Text, klant.Gewicht) Then
      klant.Gewicht = ' Some Default Value
End If

编辑:

如果您在调试器中单步调试过代码,您可能已经注意到 klant.Gewicht 为 0.0(默认值),即使在尝试将其设置为空时也是如此。

【讨论】:

对不起,应该提到,我的 Gewicht 字段声明为 Nullable,所以我实际上可以将其设置为 Nothing,但 CommandBuilder 在将其插入数据库时​​并没有注意到这一事实。 啊 - 请看这个帖子:***.com/questions/5868313/…。我自己不使用命令生成器——因为我发现它不会节省太多时间。我要么自己编写简单的查询,或者如果它更复杂 - 使用 NHibernate。 好的,谢谢,我去看看。我可以问一下解析吗?我最初按照你说的做了,但是它给了我一个错误,告诉我它不允许从 Double 进行显式转换?为Double,所以我放了CDbl(klant.Gewicht),但是如果我之后输出klant.Gewicht的值,它并没有改变。 我很抱歉。我已经相应地编辑了答案。 Nullable(of T) 公开了一个 .HasValue 和一个 .Value 成员。 .Value 成员是只读的,因此对于解析/强制转换来说,它不是可接受的 Double。而且 - 因为双?可能为空,它不能直接转换两者(如错误所示)。如果您认为已回答,请不要忘记将问题标记为已回答。如果您仍然无法使转换正常工作,您可能会提出一个特定于该问题且未引用 Access 的问题。

以上是关于在使用 VB.NET 的 Access 中将空字符串字段插入为 null的主要内容,如果未能解决你的问题,请参考以下文章

在 VB.NET 中将 UTF-8 转换为 windows-1255 编码

在 access 数据库中将 Null 转换为零

如何在 VB.net 中使用 ROWNUM 从 MS-Access 数据库中检索数据

更新查询在带有 MS Access 的 VB.NET 中不起作用

在 VB.NET 中使用 OleDb.NET 调用 Access 2010 存储选择查询的异常

如何使用VB.NET在Access数据库中插入多条记录