Return 来自子程序的多条记录并解析为数据表 [Unidata][U2.NET]
Return multiple records from subroutine and parse into datatable [Unidata][U2.NET]
我正在使用 Unidata,ADO.NET 使用 U2 .NET Provider。这可能是瞎猜的,因为现在 Unidata 和 .NET 的资源不多。
目前我只能return一条MV记录153926þIþ
并使用MV_To_DataTable
解析它。我想要 return 多个记录,例如 153926þIþÿ153926þIþÿ
。是否有任何内置机制可以执行此操作?我担心我将不得不写一个扩展来最好地适应我。
我通过这种方式在 unidata 子例程中检索单个记录:
SUBROUTINE GETITEMS(results)
EXECUTESQL "SELECT ID, STATUS, DESC FROM ITEMS TO GETITEM_LIST;"
DONE = 0
RECCNT = 0
LOOP
RECCNT += 1
READNEXTTUPLE REC FROM "GETITEM_LIST" ELSE DONE = 1
results := REC
IF RECCNT EQ 1 THEN EXIT
UNTIL DONE
REPEAT
results
CLEARSQL
RETURN
一个简单的子程序,return一个记录,没有任何记录标记。当我使用名为 MV_To_DataTable
的 U2Parameter
方法将其解析为现有数据表时,此方法有效。
然而当我改变子程序行时:
results:= REC
到 results:= REC : @RM
附加记录标记并删除 1 的限制,MV_To_DataTable
不再能够正确解析它。事实上它会抛出 System.IndexOutOfRangeException: Cannot find column 3.
VB.NET代码:
' ... Open database connection called U2Connection ...
Dim cmd = U2Connection.CreateCommand
cmd.CommandText = "CALL GETITEMS(?)"
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Clear()
cmd.Parameters.Add(New U2Parameter("@arg1", "") With {.Direction = ParameterDirection.InputOutput})
cmd.ExecuteNonQuery()
Dim tb As New DataTable
tb.Columns.Add("ID")
tb.Columns.Add("STATUS")
tb.Columns.Add("DESC")
cmd.Parameters.Item(0).MV_To_DataTable(tb) ' Error happens here
' System.IndexOutOfRangeException: Cannot find column 3.
看来该方法没有分隔记录。我可能理解错了。
*****更新 2/9/2019
我继续编写自己的扩展方法来支持我的 return 格式和记录标记。它使用记录填充数据表,让我可以像往常一样继续。
您有点跨越了 Multivalue/System。这里的数据鸿沟。如果您还没有这样做,我建议您查看 U2 Toolkit for .NET,我相信如果您当前正在进行维护,它通常很容易获得。它附带了一些示例,说明如何在 C# 和 VB 以及一些 Entity Framework 中执行此类操作。
但是至于这里发生了什么,你试图将 U2Type.DynArray 放入 System.DataTable 有点棘手,因为 DynArray 是一个 Record 状态,它可能包含来自DataSet 中的多个表。由于 @RM 是记录的终止符,因此它将 DynArray 转换为 DynArray[] 并且您不能将其作为参数。
要通过最少的重构来解决此问题,您仍然可以使用 MV_To_DataTable,但请注意,它期望您的数据以表格形式显示在单个记录中。这些示例假设换行符是属性标记 (@FM/@AM)
这是您要返回的内容
Row1Column1
Row1Column2
Row1Column3:@RM
Row2Column1
Row2Column2
Row2Column3:@RM
Row13olumn1
Row13olumn2
Row13olumn3:@RM
这就是 MV_To_DataTable 所期望的
Row1Column1:@VM:Row1Column2:@VM:Row1Column3
Row2Column1:@VM:Row2Column2:@VM:Row2Column3
Row3Column1:@VM:Row3Column2:@VM:Row3Column3
如果你调整你的 U2 sub 输出那个,它应该可以工作。
此外,您可以尝试直接对 .net 使用 SQL 命令,但由于其他原因,这会变得很危险,具体取决于您的数据。
祝你好运!
我正在使用 Unidata,ADO.NET 使用 U2 .NET Provider。这可能是瞎猜的,因为现在 Unidata 和 .NET 的资源不多。
目前我只能return一条MV记录153926þIþ
并使用MV_To_DataTable
解析它。我想要 return 多个记录,例如 153926þIþÿ153926þIþÿ
。是否有任何内置机制可以执行此操作?我担心我将不得不写一个扩展来最好地适应我。
我通过这种方式在 unidata 子例程中检索单个记录:
SUBROUTINE GETITEMS(results)
EXECUTESQL "SELECT ID, STATUS, DESC FROM ITEMS TO GETITEM_LIST;"
DONE = 0
RECCNT = 0
LOOP
RECCNT += 1
READNEXTTUPLE REC FROM "GETITEM_LIST" ELSE DONE = 1
results := REC
IF RECCNT EQ 1 THEN EXIT
UNTIL DONE
REPEAT
results
CLEARSQL
RETURN
一个简单的子程序,return一个记录,没有任何记录标记。当我使用名为 MV_To_DataTable
的 U2Parameter
方法将其解析为现有数据表时,此方法有效。
然而当我改变子程序行时:
results:= REC
到 results:= REC : @RM
附加记录标记并删除 1 的限制,MV_To_DataTable
不再能够正确解析它。事实上它会抛出 System.IndexOutOfRangeException: Cannot find column 3.
VB.NET代码:
' ... Open database connection called U2Connection ...
Dim cmd = U2Connection.CreateCommand
cmd.CommandText = "CALL GETITEMS(?)"
cmd.CommandType = CommandType.StoredProcedure
cmd.Parameters.Clear()
cmd.Parameters.Add(New U2Parameter("@arg1", "") With {.Direction = ParameterDirection.InputOutput})
cmd.ExecuteNonQuery()
Dim tb As New DataTable
tb.Columns.Add("ID")
tb.Columns.Add("STATUS")
tb.Columns.Add("DESC")
cmd.Parameters.Item(0).MV_To_DataTable(tb) ' Error happens here
' System.IndexOutOfRangeException: Cannot find column 3.
看来该方法没有分隔记录。我可能理解错了。
*****更新 2/9/2019
我继续编写自己的扩展方法来支持我的 return 格式和记录标记。它使用记录填充数据表,让我可以像往常一样继续。
您有点跨越了 Multivalue/System。这里的数据鸿沟。如果您还没有这样做,我建议您查看 U2 Toolkit for .NET,我相信如果您当前正在进行维护,它通常很容易获得。它附带了一些示例,说明如何在 C# 和 VB 以及一些 Entity Framework 中执行此类操作。
但是至于这里发生了什么,你试图将 U2Type.DynArray 放入 System.DataTable 有点棘手,因为 DynArray 是一个 Record 状态,它可能包含来自DataSet 中的多个表。由于 @RM 是记录的终止符,因此它将 DynArray 转换为 DynArray[] 并且您不能将其作为参数。
要通过最少的重构来解决此问题,您仍然可以使用 MV_To_DataTable,但请注意,它期望您的数据以表格形式显示在单个记录中。这些示例假设换行符是属性标记 (@FM/@AM)
这是您要返回的内容
Row1Column1
Row1Column2
Row1Column3:@RM
Row2Column1
Row2Column2
Row2Column3:@RM
Row13olumn1
Row13olumn2
Row13olumn3:@RM
这就是 MV_To_DataTable 所期望的
Row1Column1:@VM:Row1Column2:@VM:Row1Column3
Row2Column1:@VM:Row2Column2:@VM:Row2Column3
Row3Column1:@VM:Row3Column2:@VM:Row3Column3
如果你调整你的 U2 sub 输出那个,它应该可以工作。
此外,您可以尝试直接对 .net 使用 SQL 命令,但由于其他原因,这会变得很危险,具体取决于您的数据。
祝你好运!