以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- 存储过程执行后数据如何遍历 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=169337) |
||||
-- 作者:qq252476275 -- 发布时间: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 |
||||
-- 作者:有点蓝 -- 发布时间:2021/6/12 16:34:00 -- ExecuteReader之前的代码发上来,存储过程代码发上来看看 |
||||
-- 作者:qq252476275 -- 发布时间: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 -- 发布时间:2021/6/12 16:50:00 --
|
||||
-- 作者:qq252476275 -- 发布时间: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) |
||||
-- 作者:有点蓝 -- 发布时间:2021/6/12 16:54:00 -- foxtable使用的oledb驱动不支持存储过程里返回临时表/表变量的数据。只能使用数据表 |
||||
-- 作者:qq252476275 -- 发布时间:2021/6/12 16:56:00 -- 上面命令窗口输出 的第一行 procedure 请忽略, 是网络监视器那边的输出, 不是这个函数的。
|
||||
-- 作者:qq252476275 -- 发布时间:2021/6/15 7:41:00 -- 哪种类型的支持? |
||||
-- 作者:有点蓝 -- 发布时间: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编辑过]
|