Какой класс для сериализуемых многомерных массивов? - PullRequest
0 голосов
/ 19 февраля 2009

РЕДАКТИРОВАТЬ: см. Ниже

У меня есть веб-сервис, который использует класс функций для возврата данных, используемых в различных бизнес-процессах (через InfoPath).

Одна из функций берет заданный объект SQLCommand и выполняет его в SQLDataReader. Теперь, в зависимости от используемого текста команды SQL, это может вернуть одну или несколько строк одного или нескольких столбцов. Так что это лучший класс для этой функции, чтобы возвращать, учитывая, что она должна быть сериализована веб-сервисом.

Мой существующий код:

    Dim array As New ArrayList

    Try

        conCMS.Open()
        Dim rdr As SqlDataReader = cmdCurrent.ExecuteReader

        While rdr.Read
            If rdr.VisibleFieldCount > 1 Then
                Dim complexType(rdr.VisibleFieldCount - 1) As String
                For rowIndex As Integer = 0 To rdr.VisibleFieldCount - 1
                    complexType(rowIndex) = rdr(rowIndex)
                Next
                array.Add(complexType)
            Else
                array.Add(rdr(0))
            End If
        End While
        conCMS.Close()

        Return array

    Catch ex As Exception

        array.Add("ERROR " & ex.Message)

    End Try

    Return Nothing

Теперь я знаю, что это не эффективный код, но эта работа еще не завершена.

Как вы, вероятно, можете видеть, это генерирует строковый массив для представления строки с более чем одним столбцом, однако он не может быть сериализован веб-службой.

Итак, 2 вещи действительно;

  • Некоторые рекомендации по использованию эффективного типа (без написания моего сериализуемого класса)
  • Несколько советов по улучшению кода в будущем.

Заранее спасибо

EDIT: Мне удалось заставить сериализацию работать, просто создав вложенный arrayList следующим образом (doh!):

   If rdr.VisibleFieldCount > 1 Then
    Dim complexType As New ArrayList
    For rowIndex As Integer = 0 To rdr.VisibleFieldCount - 1
      complexType.Add(rdr(rowIndex))
    Next
    array.Add(complexType)
   Else
    array.Add(rdr(0))
   End If

Однако, пожалуйста, дайте мне знать, как это можно улучшить.

1 Ответ

1 голос
/ 19 февраля 2009

Если ваш код знает схему возвращенных данных до вызова, то вы должны вернуть данные в той же форме. Иметь структуру или класс со свойствами соответствующего типа для каждого столбца возвращаемых данных. Для каждой строки создайте экземпляр такой структуры и заполните свойства из возвращаемых столбцов. Затем добавьте каждый экземпляр в строго типизированный список этой структуры, List (Of T). Затем верните список.

OBTW, ArrayList был создан до того, как у нас были дженерики в .NET. Сегодня лучше использовать строго типизированные коллекции, а не ArrayList, который в основном является списком (из что-нибудь ).

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