我们在数据管理软件的开发过程中,数据类型转换是必不可少的。在一些表格的数据统计中,我们通常都是通过DataRow对象来访问获得表中的数据的,DataRow.Item属性返回的是一个Object类型。
我们知道,VB.Net中是支持隐式类型转换的,常规情况下像下面的代码是可以执行的。可是有一点比较特殊,那就是一般情况下我们表中的数据可能为空,DataRow取出来的值为DBNull.Value。而DBNull.Value是无法转换成其他数据类型的。
If Proj.CurrentGrid Is Nothing Then
Return
End If
Dim dr As DataRow=Proj.CurrentGrid.CurrentRowData.BaseRow
Dim aa As Integer=dr("数量")
Dim bb As Decimal=dr("数量")*dr("单价")
|
我们如果写上下面的代码的话,保存或执行时会提示【类型“System.DBNull”的值无法转换为“Integer”】。虽然我们可以用Object类型变量来接收DBNull.Value的结果,
可是我们最终需要计算使用时还是会报错。
Dim i As Integer=DBNull.Value
如果想不出错,需要进行为空判断,比如:
Dim aa As Integer=IIf(dr.IsNull("数量"),0,dr("数量"))
如果需要大量引用的场景的话,代码编写会非常麻烦。为了解决这个问题,我们平台引入了RowData对象。这个对象是对DataRow对象的功能扩展,可以通过DataRow.GetRowData()
扩展方法获得RowData对象。通过RowData对象的Item属性来访问各个字段的数据。同样此属性返回的数据类型也是Object类型,但是这个结果返回的值是做过转换的。
如果遇到空值的情况会做如下处理:
数据类型 | 返回默认值 |
字符串 | "" |
数值 | 0 |
日期 | DateTime.MinValue |
逻辑 | FALSE |
这样在VB.Net中我们就可以大胆地直接使用结果进行直接赋值或参与运算,而不需要麻烦地判断数据是否为空,然后再进行类型转换。当然,在常规的使用场景下,我们大可直接就
使用RowData对象来读取行中的数据。但是,在一些对循环比较多,性能比较注重的场合,在赋值时我们可以考虑直接通过DataRow来读取。因为RowData返回的结果是经过处理的。
一些空值会被转化成其他值。这种处理一是会影响性能,另外也会影响复制的结果。
'向当前表中添加一些数据
Dim tbl As SmGrid=Proj.CurrentSmGrid
'通过SQL从数据库中获得数据
Dim dt As DataTableHelp=Proj.DatabaseForUserDB.ExecuteDataTableHelp("select * from tableName where ID>12")
If dt IsNot Nothing AndAlso dt.DataRows.Count>0 Then '如果数据不为空
'遍历所有查询到的结果
For Each dr As RowData In dt.DataRows
'在当前表中新增一行
Dim drNew As RowData=tbl.DataTableHelp.AddNew()
'获得DataRow对象
Dim drOri As DataRow=dr.BaseRow
'遍历所有列
For Each col As ColData In tbl.DataTableHelp.DataCols
'如果当前表与查询到的结果中包含相同列名
If dt.DataCols.Contains(col.Name) Then
'直接通过DataRow对象读取结果赋值给新增的RowData对象中。
'这时选择不直接通过dr(col.Name)读取结果,是因为RowData返回的结果是经过处理的。一些空值会被转化
drNew(col.Name)=drOri(col.Name)
End If
Next
Next
End If |