(在2021.4.29版本后,官方已经增加组合查询直转DataTable的方法,新版本用户不需要学习本帖子)
一、发现需求:
'用于给fxDataSource这种合并表转Json用的
'fxDataSource底层是Data.DataTable
Dim dt As Data.DataTable = args(0)
Dim jo As New JObject
Dim ja As New JArray
jo("list") =ja
For i As Integer =0 To (dt.Rows.Count - 1)
Dim jo2 As new JObject
ja.Add(jo2)
Dim dr As Data.DataRow = dt.Rows(i)
Functions.Execute("fxRow2JObject",dr,jo2)
Next
Return jo2.fxRow2JObject'用于给fxDataSource这种合并表转Json用的
Dim dr As Data.DataRow = args(0)
Dim jo As JObject = args(1)
Static dCols As new List(of String)
dCols.Add("_Identify")
dCols.Add("_Locked")
dCols.Add("_SortKey")
dCols.Add("System_Sort_Temporary")
dCols.Add("System_Filter_Temporary")
dCols.Add("System_Filter_Unique")
Dim dcType As String
Dim dcName As String
For Each dc As Data.DataColumn In dr.Table.Columns
dcType = dc.DataType.Name
dcName = dc.ColumnName
'把底层表没用的几列排除掉
If dCols.Contains(dcName) Then
Continue For
End If
If dcType ="String" Then
If dr.IsNull(dcName) Then
jo(dcName) = ""
Else
jo(dcName) = CStr(dr(dcName))
End If
Else If dcType ="Boolean" Then
jo(dcName) = CBool(dr(dcName))
Else If dcType ="Int16" OrElse dcType ="Int32" OrElse dcType ="Byte" OrElse dcType ="Single" OrElse dcType ="Double" OrElse dcType ="Decimal" Then
If dr.IsNull(dcName) Then
jo(dcName) = 0
Else
jo(dcName) = Val(dr(dcName))
End If
Else If dcType ="DateTime" Then
If dr.Isnull(dcName) =False Then
jo(dcName) = CStr(dr(dcName))
Else
jo(dcName) = ""
End If
End If
NextFor Each dr As Data.DataRow In dt1.Rows
dr("型号") = "aaa"
NextFor Each dr As Data.DataRow In dt1.Rows
//错误写法,会如下图报错,什么DBNull不支持运算符之类的
dr("退货总金额") = dr("退货数量") * dr("退货金额")
//正确写法
dr("退货总金额") = Val(dr("退货数量").ToString) * Val(dr("退货金额").ToString)
NextIf dt1.Columns.Contains("新列") =False Then
dt1.Columns.Add("新列",Gettype(String))
End If可以添加的类型有以下| 名称 | .net类型 | 对应狐表类型 |
| 字符串(常用) | System.String | String |
| 日期时间(常用) | System.DateTime | Date |
| 逻辑值(常用) | System.Boolean | Boolean |
| 微整数 | System.Byte | Byte |
| 短整数 | System.Int16 | Short |
| 整数(常用) | System.Int32 | Integer |
| 长整数 | System.Int64 | Long |
| 单精度小数 | System.Single | Single |
| 双精度小数 | System.Double | Double |
| 高精度小数(常用) | System.Decimal | Decimal |
If dt1.Columns.Contains("利润") =False Then
dt1.Columns.Add("利润",Gettype(Decimal),"IsNull(销售_金额,0) - IsNull(进货_金额)")
End IfDim dr As Data.DataRow = dt.NewRow //第一步创建独立 行对象
dr("型号") = "aaa"
dt.Rows.Add(dr) //第二步把 行对象 添加到 行集合
Output.show(dt.Rows.Count) //得到结果是1