Возврат нескольких записей из подпрограммы и анализ в datatable [Unidata] [U2.NET] - PullRequest
0 голосов
/ 08 февраля 2019

Я работаю с Unidata и ADO.NET с помощью провайдера U2 .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

Я пошел дальше и написал свой собственный метод расширения для поддержки моего формата возврата с маркерами записи.Он заполняет таблицу данными записями, позволяющими мне продолжить, как обычно.

1 Ответ

0 голосов
/ 09 февраля 2019

Вы как бы пересекаете разделение Многозначность / Система. Данные здесь.Если вы еще этого не сделали, я бы посоветовал изучить U2 Toolkit для .NET, который, как я полагаю, обычно доступен, если вы уже в курсе технического обслуживания.Он содержит несколько примеров того, как делать такие вещи в C # и VB, а также некоторые вещи Entity Framework.

Но что касается того, что здесь происходит, вы пытаетесь поместить U2Type.DynArray в System.DataTable, что довольно сложно, так как DynArray - это состояние записи, которое может содержать несколько строк из нескольких таблиц в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 на вывод, он должен работать.

Кроме того, вы можете попробовать использовать команду SQL напрямую для .net, но это становится опасным по другим причинам, в зависимости от ваших данных.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...