2

我正在使用 U2 .NET Provider 与 Unidata 和 ADO.NET 合作。这可能是在黑暗中拍摄,因为如今 Unidata 和 .NET 的资源并不多。

目前我只能返回单个 MV 记录153926þIþ并使用MV_To_DataTable. 我想返回多条记录,例如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

简单的子例程,返回一条没有任何记录标记的记录。当我使用U2Parameter调用的方法将MV_To_DataTable其解析为现有数据表时,此方法有效。

但是,当我更改子程序行: 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

我继续编写了我自己的扩展方法来支持我的记录标记返回格式。它使用记录填充数据表,使我可以像往常一样继续。

4

1 回答 1

2

您在这里有点跨越 Multivalue/System.Data 的鸿沟。如果您还没有这样做,我建议您查看适用于 .NET 的 U2 Toolkit,如果您当前正在维护,我相信它通常很容易获得。它附带了一些如何在 C# 和 VB 中执行此类操作的示例以及一些实体框架的东西。

但至于这里发生了什么,您试图将 U2Type.DynArray 放入 System.DataTable 有点棘手,因为 DynArray 是一个记录状态,它可能包含来自数据集中多个表的多行。由于@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 来输出它,它应该可以工作。

此外,您可以尝试将您的 SQL 命令直接用于 .net,但这会因为其他原因而变得危险,具体取决于您的数据。

祝你好运!

于 2019-02-08T21:02:44.170 回答