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_DataTableU2Parameter 方法将其解析为现有数据表时,此方法有效。

然而当我改变子程序行时: results:= RECresults:= 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 命令,但由于其他原因,这会变得很危险,具体取决于您的数据。

祝你好运!