在使用 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 编码
如何在 VB.net 中使用 ROWNUM 从 MS-Access 数据库中检索数据
更新查询在带有 MS Access 的 VB.NET 中不起作用