Foxtable(狐表)用户栏目专家坐堂 → [求助]传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 4


  共有2673人关注过本帖树形打印复制链接

主题:[求助]传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 4

帅哥哟,离线,有人找我吗?
huangfanzi
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
[求助]传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 4  发帖心情 Post By:2018/6/20 21:00:00 [只看该作者]

在QQServer服务端的计划中有段程序用于计算,不知什么原因在计算时有时会弹出以下错误:
传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确。参数 4 (""): 提供的值不是数据类型 float 的有效实例。请检查源数据中的无效值。例如,小数位数大于精度的数值类型的数据即为无效值。
计算的代码如下,我现在不知是在何种情况下为弹出错误,一但弹出错误就会停止运算,把错误提示框关闭后再把计划管理程序重新启动下就又一切正常了
有何办法例如加些代码能让我知道到底是那行代码产生的错误,又有何办法能使产生了错误后计划管理程序代码自动重启一下
谢谢老师!

MyTimers("末端投料计算").Enabled = False

Dim drs任务 As List(Of DataRow) = _dt末端投料计算任务表.SQLSelect("[母捆包号] <> '' ") '读取任务表中记录并且写入drs任务集合
If drs任务.Count > 0 Then
    Dim tp As TimeSpan '定义作业分钟分摊
    Dim Jb2 As New List(Of String) '定义记录标记2的集合Jb2
    Dim Mkbh As New List(Of String) '定义母捆包号的集合Mkbh
    
    For Each dr As DataRow In drs任务
        If dr("来源表名") = "生产记录" AndAlso Jb2.Contains(dr("记录标记2"))= False Then '将不同的来自于生产记录表的记录标记2写入Jb2集合
            Jb2.Add(dr("记录标记2"))
        End If
        If Mkbh.Contains(dr("母捆包号"))= False Then '将不同的母捆包号写入Mkbh集合
            Mkbh.Add(dr("母捆包号"))
        End If
    Next
    
    For Each jlbj2 As String In Jb2
        '作业分钟分摊计算
        Dim drs时间 As List(Of DataRow) = _dt工序合并表.SQLSelect("记录标记2 = '" & jlbj2 & "'") '将当前的记录标记2写入集合
        If drs时间.Count = 0 Then
        ElseIf drs时间.Count = 1 Then
            tp = drs时间(0)("结束时间") - drs时间(0)("起始时间")
            drs时间(0)("作业分钟分摊") = tp.TotalSeconds()/60
        Else
            Dim Sum As Double = _dt工序合并表.SQLCompute("Sum(数量)","记录标记2 = '" & jlbj2 & "'")
            For i As Integer = 0 To drs时间.Count - 1
                tp = drs时间(i)("结束时间") - drs时间(i)("起始时间")
                drs时间(i)("作业分钟分摊") = tp.TotalSeconds()/60/Sum * drs时间(i)("数量")
            Next
        End If
        _dt工序合并表.SQLUpdate(drs时间)
    Next
    
    For Each nm As String In Mkbh
        '末端标记计算
        Dim drs末端 As List(Of DataRow) = _dt工序合并表.SQLSelect("母捆包号 = '" & nm & "'","","捆包号,起始时间") '将当前的母捆包号写入集合
        
        If drs末端.Count = 0 Then
        ElseIf drs末端.Count = 1 Then
            drs末端(0)("末端标记") = True
        Else
            For i As Integer = 1 To drs末端.Count - 1
                If drs末端(i)("捆包号").Contains(drs末端(i-1)("捆包号")) Then
                    drs末端(i-1)("末端标记") = False
                Else
                    drs末端(i-1)("末端标记") = True
                End If
            Next
            drs末端(drs末端.Count-1)("末端标记") = True
        End If
        _dt工序合并表.SQLUpdate(drs末端)
        
        
        '投料量和成材率计算
        Dim drs投料量 As List(Of DataRow) = _dt工序合并表.SQLSelect("母捆包号 = '" & nm & "'","","捆包号,起始时间") '将当前的母捆包号写入集合
        If drs投料量.Count = 0 Then
        ElseIf drs投料量.Count=1 Then
            drs投料量(0)("投料量") = drs投料量(0)("数量")
            drs投料量(0)("成材率") = drs投料量(0)("数量") / drs投料量(0)("投料量")
        Else
            drs投料量(0)("投料量")=drs投料量(0)("数量")
            Dim tll As Double = drs投料量(0)("投料量") '+++
            Dim dic As New Dictionary(Of String, Double())
            Dim Dic_dr As new Dictionary(of DataRow, Double)
            For i As Integer = 1 To drs投料量.Count - 1
                If drs投料量(i)("捆包号") = drs投料量(i-1)("捆包号")
                    Dic_dr.Add(drs投料量(i), tll)
                Else
                    Dim str As String = drs投料量(i)("捆包号").Substring(0,drs投料量(i)("捆包号").length - 4) '此处减去数字4代表上一个捆包编号
                    If dic.ContainsKey(str) = False Then
                        Dim fdr As DataRow = _dt工序合并表.SQLFind("捆包号 = '" & str  & "'", "起始时间")
                        If fdr IsNot Nothing Then
                            
                            Dim drs投料量_temp As List(of DataRow) = _dt工序合并表.SQLSelect("substring(捆包号,1," & drs投料量(i)("捆包号").Length -  4 & ") = '" & fdr("捆包号") & "' and len(捆包号) = " & drs投料量(i)("捆包号").Length,"","捆包号")
                            If drs投料量_temp.Count > 0 Then
                                Dim zl As Double = drs投料量_temp(0)("数量")
                                For j As Integer = 1 To drs投料量_temp.Count - 1
                                    
                                    If drs投料量_temp(j)("捆包号") <> drs投料量_temp(j-1)("捆包号") Then
                                        zl += drs投料量_temp(j)("数量")
                                    End If
                                Next
                                dic.Add(str, new Double(){zl, tll})
                            Else
                                MessageBox.Show("发生代码运算错误,此错误的相关代码位于全局表事件的DataColChanged事件中,看到此条消息请与管理员联系!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning)
                            End If
                        Else
                            tll = drs投料量(i)("数量")
                            Dic_dr.Add(drs投料量(i), tll)
                            Continue For
                        End If
                    End If
                    tll = drs投料量(i)("数量") / dic(str)(0) * dic(str)(1)
                    Dic_dr.Add(drs投料量(i), tll)
                End If
            Next
            
            For Each dr As DataRow In dic_dr.Keys
                dr("投料量") = dic_dr(dr)
            Next
            For i As Integer = 0 To drs投料量.Count - 1
                drs投料量(i)("成材率") = drs投料量(i)("数量") / drs投料量(i)("投料量")
            Next
        End If
        
        _dt工序合并表.SQLUpdate(drs投料量)
    Next
    _dt末端投料计算任务表.SQLDeleteFor("母捆包号 in ('" & String.Join("','", mkbh.ToArray) & "')")
    _dt末端投料计算任务表.Save
End If

MyTimers("末端投料计算").Enabled = True
[此贴子已经被作者于2018/6/20 21:03:53编辑过]

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/20 21:11:00 [只看该作者]

肯定是你修改了数据库表结构造成的。不要直接在数据库乱改表结构,这样极容易导致不匹配。

 

如果要修改类型请直接在foxtable里面修改,不然很可能不匹配。

 

对比表格里面各个列和你数据库各个列的类型看有什么区别。


 回到顶部
帅哥哟,离线,有人找我吗?
huangfanzi
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:五尾狐 帖子:1104 积分:8956 威望:0 精华:0 注册:2014/10/25 11:24:00
  发帖心情 Post By:2018/6/20 21:24:00 [只看该作者]

计划管理代码中并没有修改表结构,仅仅是计算,唯一的可能会不会【投料量】这一列,我设置的是双精度型,但在计算结果中可能会出现无限小数,导致这个无限小数储存时由于位数太多发生错误

 回到顶部
帅哥哟,离线,有人找我吗?
有点甜
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:版主 帖子:85326 积分:427815 威望:0 精华:5 注册:2012/10/18 22:13:00
  发帖心情 Post By:2018/6/20 22:19:00 [只看该作者]

1、把双精度小数改成高精度小数,再改回来,看是否报错;

 

2、修改以后重新测试代码。(必要在计划管理里面测试,单独测试代码)


 回到顶部