Foxtable(狐表)用户栏目专家坐堂 → 存储过程执行后数据如何遍历


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

主题:存储过程执行后数据如何遍历

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


加好友 发短信
等级:幼狐 帖子:196 积分:1429 威望:0 精华:0 注册:2020/5/23 14:56:00
存储过程执行后数据如何遍历  发帖心情 Post By:2021/6/12 16:31:00 [只看该作者]

请教使用存储过程执行后的DataTable,如何遍历,现跟踪后出现以下错误信息:

         前面的代码进行存储过程的参数设置,数据源等设置

        Output.show("存储过程查询记录集")           '                       执行到此,命令窗口有输出
        Dim dt As DataTable = cmd.ExecuteReader
        Output.show("存储过程查询over")             '                       执行到此,命令窗口有输出
        Output.Show( dt.DataRows.Count)         
        Output.Show( "111111")                       '       执行上一句 dt.DataRows.Count 报错。

        '遍历记录
        Dim arr As new JArray
        For i As Integer = 0 To dt.DataRows.Count - 1
            Output.Show(i)
            arr.Add(new JObject)
            Dim dr As DataRow = dt.DataRows(i)
            For Each dc As DataCol In dt.DataCols
                If dc.IsNumeric Then
                    arr(i)(dc.Caption) = val(dr(dc.Name))
                Else
                    arr(i)(dc.Caption) = dr(dc.Name).ToString()
                End If
            Next
        Next
        '生成json
        obj("count") = val(dt.DataRows.Count)
        obj("data") = arr


跟踪执行命令窗口报错:

存储过程查询记录集
存储过程查询over
errlog:
2021-06-12 16:22:10.4546
事件/函数:自定义函数,sqlProcedure
调用的目标发生了异常。
   在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   在 Foxtable.UserFunctions.Execute(String Name, Object[] Args)
未将对象引用设置到对象的实例。
   在 UserCode.A7v0NGshqQurSnDuO(Object[] Args)


---------

dt.DataRows.Count,出错了,错误信息如上, 导致不能进行遍历dt。

后面的遍历语句,参考的是SQLGroupTableBuilder, 可以正常输出。

If obj("code") = "0" Then
Dim b As New SQLGroupTableBuilder(strCaption ,e.values("baseTable"))
        dt = b.Build(True)
        '遍历记录
        Dim arr As new jarray
        For i As Integer = 0 To dt.DataRows.Count - 1
            arr.Add(new jobject)
            Dim dr As DataRow = dt.DataRows(i)
            For Each dc As DataCol In dt.DataCols
                If dc.IsNumeric Then
                    arr(i)(dc.Caption) = val(dr(dc.Name))
                Else
                    arr(i)(dc.Caption) = dr(dc.Name).ToString()
                End If
            Next
        Next
        '生成json
        obj("code") = 0
        obj("count") = val(dt.DataRows.Count)
        obj("data") = arr
        
    End If

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/12 16:34:00 [只看该作者]

ExecuteReader之前的代码发上来,存储过程代码发上来看看

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


加好友 发短信
等级:幼狐 帖子:196 积分:1429 威望:0 精华:0 注册:2020/5/23 14:56:00
  发帖心情 Post By:2021/6/12 16:46:00 [只看该作者]

sqlProcedure函数:

Dim e As RequestEventArgs = Args(0)
Dim cmd As New SQLCommand

Dim obj   As new Jobject ' 返回值,前端根据此进行相应的处理
obj("code") = 0
obj("count") = 0
obj("Info")  = ""

' 数据源
Dim strDataSource As String
If e.Values.ContainsKey("dataSource") Then
    strDataSource = e.Values("dataSource")
Else
    obj("code") = "401"
    obj("Info") = "尚未指定dataSource参数!"
End If

' 调用的存储过程
Dim strProcedureName As String
If e.Values.ContainsKey("proName") Then
    strProcedureName = e.Values("proName")
Else
    obj("code") = "401"
    obj("Info") = "尚未指定proName参数!"
End If
Output.show("开始准备参数")
cmd.StoredProcedure = True '表示CommandText内容不是标准的SQL语句,而是存储过程名

' 写入输入参数
Dim bHaveOutPut As Boolean = False    ' 是否有输出参数
Dim bHaveReturn As Boolean = False    ' 是否有返回值

Dim arrParm As JArray
Dim arrParamName As new List(of String)
If e.Values.ContainsKey("param") Then
    arrParm = JArray.parse(e.Values("param"))
    Output.show(e.Values("param"))
    Dim parName   As String = ""        ' 存储过程的参数名称
    Dim parValue  As String = ""        ' 存储过程的参数值
    Dim parOutput As Boolean = False    ' 此参数为返回参数为FALSE, 输出参数为TRUE
    Dim bHaveOut  As Boolean = False
    Dim parSize   As Integer = 0        ' 输出参数的字节大小
    Dim bHaveSize As Boolean = False
    
    '获取各参数的值
    For Each jt As JToken In arrParm
        ' 数组遍历
        ' 变量重新初始化
        parName = ""
        parValue = ""
        parOutPut = False
        parSize = 0
        bHaveOut = False
        bHaveSize = False
        
        For Each jp As JProperty In jt
            ' 集合遍历
            Output.Show( jp.name.ToString )
            Output.Show(jp.value.ToString)
            
            Select Case jp.name.ToString
                Case "name" :
                    parName = jp.value.ToString
                    arrParamName.Add(parName)
                Case "value" :
                    parValue = jp.value.ToString
                Case "output" :
                    parOutput = jp.value.ToString
                    bHaveOut = True
                    If parOutput = True Then
                        bHaveOutput = True
                    Else
                        bHaveReturn = True
                    End If
                Case "size" :
                    parSize   = Val(jp.value.ToString)
                    bHaveSize = True
            End Select
        Next
        '根据输入值,选择执行函数
        If bHaveOut = True And bHaveSize = True   Then    ' 输出参数且有size
            cmd.Parameters.add( parName , parValue , parOutput , parSize )
        ElseIf bHaveOut = True And bHaveSize = False Then ' 输出参数无size
            cmd.Parameters.Add( parName , parValue , parOutput)
        Else ' 输入参数
            cmd.Parameters.Add( parName , parValue)
        End If
        
    Next
    Output.Show("读取参数")
    
End If

If obj("code") = "0" Then
    If bHaveReturn Or bHaveOutput Then
        Output.show("存储过程非查询记录集")
        cmd.ExecuteNonQuery
        Dim arr1 As New Jarray
        For Each ex As String In arrParamName
            arr1(0)(ex) = cmd.Parameters(ex)
        Next
        obj("count") = 1
        obj("data")  = arr1
    Else
        Output.show("存储过程查询记录集")
        Dim dt As DataTable = cmd.ExecuteReader
        Output.show("存储过程查询over")
        Output.Show( dt.DataRows.Count)
        Output.Show( "111111")

        '遍历记录
        Dim arr As new JArray
        For i As Integer = 0 To dt.DataRows.Count - 1
            Output.Show(i)
            arr.Add(new JObject)
            Dim dr As DataRow = dt.DataRows(i)
            For Each dc As DataCol In dt.DataCols
                If dc.IsNumeric Then
                    arr(i)(dc.Caption) = val(dr(dc.Name))
                Else
                    arr(i)(dc.Caption) = dr(dc.Name).ToString()
                End If
            Next
        Next
        '生成json
        obj("count") = val(dt.DataRows.Count)
        obj("data") = arr
    End If
End If

'返回到页面
e.WriteString(CompressJson(obj))
e.Handled = True

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


加好友 发短信
等级:幼狐 帖子:196 积分:1429 威望:0 精华:0 注册:2020/5/23 14:56:00
  发帖心情 Post By:2021/6/12 16:50:00 [只看该作者]

 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:procedure.txt

附件分别为,存储过程sql语句, 及执行后的结果图
图片点击可在新窗口打开查看此主题相关图片如下:procedure.png
图片点击可在新窗口打开查看

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


加好友 发短信
等级:幼狐 帖子:196 积分:1429 威望:0 精华:0 注册:2020/5/23 14:56:00
  发帖心情 Post By:2021/6/12 16:54:00 [只看该作者]

命令窗口的输出:

procedure
开始准备参数
[{"name":"@user","value":"admin"},{"name":"sDate","value":"2021-5-26"},{"name":"eDate","value":"2021-6-25"}]
name
@user
value
admin
name
sDate
value
2021-5-26
name
eDate
value
2021-6-25
读取参数
存储过程查询记录集
存储过程查询over
errlog:
2021-06-12 16:22:10.4546
事件/函数:自定义函数,sqlProcedure
调用的目标发生了异常。
   在 System.RuntimeMethodHandle.InvokeMethod(Object target, Object[] arguments, Signature sig, Boolean constructor)
   在 System.Reflection.RuntimeMethodInfo.UnsafeInvokeInternal(Object obj, Object[] parameters, Object[] arguments)
   在 System.Reflection.RuntimeMethodInfo.Invoke(Object obj, BindingFlags invokeAttr, Binder binder, Object[] parameters, CultureInfo culture)
   在 Foxtable.UserFunctions.Execute(String Name, Object[] Args)
未将对象引用设置到对象的实例。
   在 UserCode.A7v0NGshqQurSnDuO(Object[] Args)


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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/12 16:54:00 [只看该作者]

foxtable使用的oledb驱动不支持存储过程里返回临时表/表变量的数据。只能使用数据表

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


加好友 发短信
等级:幼狐 帖子:196 积分:1429 威望:0 精华:0 注册:2020/5/23 14:56:00
  发帖心情 Post By:2021/6/12 16:56:00 [只看该作者]

上面命令窗口输出 的第一行 procedure 请忽略,
 是网络监视器那边的输出, 不是这个函数的。

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


加好友 发短信
等级:幼狐 帖子:196 积分:1429 威望:0 精华:0 注册:2020/5/23 14:56:00
  发帖心情 Post By:2021/6/15 7:41:00 [只看该作者]

哪种类型的支持?

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


加好友 发短信
等级:超级版主 帖子:110574 积分:562760 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/15 8:44:00 [只看该作者]

foxtable内置的数据库功能目前仅支持oledb驱动。可以考虑使用.net自己的Sqlclient组件,或者一些第三方的组件比如:http://www.foxtable.com/bbs/dispbbs.asp?BoardID=2&ID=159738&replyID=&skin=1
[此贴子已经被作者于2021/6/15 8:44:13编辑过]

 回到顶部