我正在使用 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:= 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
我继续编写了我自己的扩展方法来支持我的记录标记返回格式。它使用记录填充数据表,使我可以像往常一样继续。