在 vb.net 中处理 dbnull 数据
我想生成从 MS-Access 数据库检索并存储在 DataTable 对象/变量 myDataTable 中的数据的一些格式化输出。 但是,myDataTable 中的某些字段包含 dbNull 数据。 因此,如果 lastname、intials 或 sID 任何字段的值为 sID,则以下 VB.net 代码片段将给出错误>dbNull。
dim myDataTable as DataTable
dim tmpStr as String
dim sID as Integer = 1
...
myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table
...
For Each myItem As DataRow In myDataTable.Rows
tmpStr = nameItem("lastname") + " " + nameItem("initials")
If myItem("sID")=sID Then
' Do something
End If
' print tmpStr
Next
那么,当字段可能包含 dbNull 时,如何使上述代码正常工作,而不必每次都检查数据是否为 dbNull,如 这个问题?
I want to generate some formatted output of data retrieved from an MS-Access database and stored in a DataTable object/variable, myDataTable. However, some of the fields in myDataTable cotain dbNull data. So, the following VB.net code snippet will give errors if the value of any of the fields lastname, intials, or sID is dbNull.
dim myDataTable as DataTable
dim tmpStr as String
dim sID as Integer = 1
...
myDataTable = myTableAdapter.GetData() ' Reads the data from MS-Access table
...
For Each myItem As DataRow In myDataTable.Rows
tmpStr = nameItem("lastname") + " " + nameItem("initials")
If myItem("sID")=sID Then
' Do something
End If
' print tmpStr
Next
So, how do i get the above code to work when the fields may contain dbNull without having to check each time if the data is dbNull as in this question?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(14)
我知道的唯一方法是对其进行测试,您可以进行组合,以使其变得容易。
我用 VB 编写,因为这看起来就是您所需要的,即使您混合了多种语言。
编辑
清理以使用 IsDbNull 使其更具可读性
The only way that i know of is to test for it, you can do a combined if though to make it easy.
I wrote in VB as that is what it looks like you need, even though you mixed languages.
Edit
Cleaned up to use IsDbNull to make it more readable
我厌倦了处理这个问题,所以我编写了一个 NotNull() 函数来帮助我解决这个问题。
用法:
我的 NotNull() 函数多年来经历了几次大修。 在使用泛型之前,我只是将所有内容指定为对象。 但我更喜欢通用版本。
I got tired of dealing with this problem so I wrote a NotNull() function to help me out.
Usage:
My NotNull() function has gone through a couple of overhauls over the years. Prior to Generics, I simply specified everything as an Object. But I much prefer the Generic version.
您还可以使用 Convert.ToString() 和 Convert.ToInteger() 方法有效地转换 DB null 的项目。
You can also use the Convert.ToString() and Convert.ToInteger() methods to convert items with DB null effectivly.
Steve Wortham 的代码 的变体,名义上与
nullable
类型一起使用:例如,
您可以查询
mynullable
(例如,mynullable.HasValue
)A variation on Steve Wortham's code, to be used nominally with
nullable
types:e.g.
You can then query
mynullable
(e.g.,mynullable.HasValue
)微软在.NET 1.0中提出了DBNull来表示数据库NULL。 但是,使用起来很麻烦,因为您无法创建强类型变量来存储真实值或 null。 Microsoft 在 .NET 2.0 中使用可空类型解决了这个问题。 但是,您仍然受困于使用 DBNull 的大量 API,并且无法更改它们。
只是一个建议,但我通常做的是:
Microsoft came up with DBNull in .NET 1.0 to represent database NULL. However, it's a pain in the behind to use because you can't create a strongly-typed variable to store a genuine value or null. Microsoft sort of solved that problem in .NET 2.0 with nullable types. However, you are still stuck with large chunks of API that use DBNull, and they can't be changed.
Just a suggestion, but what I normally do is this:
您可以使用 IsDbNull 函数:
You can use the IsDbNull function:
如果您使用 BLL/DAL 设置,请在读入 DAL 中的对象时尝试 iif
If you are using a BLL/DAL setup try the iif when reading into the object in the DAL
对于包含字符串的行,我可以将它们转换为字符串,就像更改
为
对于 if 语句 myItem("sID")=sID 中的比较,它需要是更改为
然后,代码将运行,不会因 vbNull 数据而出现任何运行时错误。
For the rows containing strings, I can convert them to strings as in changing
to
For the comparison in the if statement myItem("sID")=sID, it needs to be change to
Then the code will run without any runtime errors due to vbNull data.
我认为这应该更容易使用:
复制自: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ
I think this should be much easier to use:
Copied from: http://www.codeproject.com/Questions/736515/How-do-I-avoide-Conversion-from-type-DBNull-to-typ
Hello Friends
这是检查 DataGrid 中的 db Null 并转换为字符串的最短方法
Hello Friends
This is the shortest method to check db Null in DataGrid and convert to string
这是迄今为止将
DBNull
转换为字符串的最简单方法。诀窍是,在引用数据库中的字段时,您不能使用
TRIM
函数(这是我最初的问题):BEFORE(生成错误消息):
之后(不再有错误消息:-)):
This is BY FAR the easiest way to convert
DBNull
to a string.The trick is that you CANNOT use the
TRIM
function (which was my initial problem) when referring to the fields from the database:BEFORE (produced error msg):
AFTER (no more error msg :-) ):
简单,但不明显。
我讨厌VB.NET
Simple, but not obvious.
I hate VB.NET
对于您的问题,您可以使用以下仅存在于 VB.Net 中的特殊解决方法编码。
此代码将用整数 0 替换
id
列中包含的DBNull
值。唯一可接受的默认值是“0”,因为当
dr( “id”)
不为 NULL!因此,使用这种技术,您的代码将是
我已经测试了此解决方案,并且它可以在我的 PC 上的 Visual Studio 2022 上运行。
PS:如果
sID
可以等于 0 并且您想要在以下情况下执行不同的操作dr("sID")
值为 NULL,您还必须熟练编程,并且可能使用本答案末尾建议的Extension
。我已经测试了以下语句
以下语句也可以正常工作
我认识到这有点棘手。
如果您不喜欢技巧,您还可以定义一个
扩展
,以便以下代码可以工作。其中 GetInteger() 代码可以跟随
这些方法更明确且不那么棘手。
此外,还可以定义除 ZERO 以外的默认值,也可以定义特定版本为
GetBoolean()
或GetDate()
等...另一种可能性是报告 SQL SQL 命令中的默认转换使用
COALESCE
SQL 命令!For your problem, you can use following special workaround coding that only exists in
VB.Net
.This code will replace
DBNull
value contained inid
column by integer 0.The only acceptable default value is "0" because this expression must also be used when
dr("id")
is not NULL !So, using this technic, your code would be
I have tested this solution and it works on my PC on Visual Studio 2022.
PS: if
sID
can be equal to 0 and you want to do something distinct whendr("sID")
value is NULL, you must also adept you program and perhaps useExtension
as proposed at end of this answer.I have tested following statements
Following statements works also correctly
I recognize that is a little tricky.
If trick are not your tips, you can also define an
Extension
so that following code works.where GetInteger() code can be following
These methods are more explicitely and less tricky.
In addition, it is possible to define default values other than ZERO and also specific version as
GetBoolean()
orGetDate()
, etc ...Another possibility is to report SQL default conversion in SQL command using
COALESCE
SQL command !