Возврат данных многомерного массива из C # webservice в vba - PullRequest
2 голосов
/ 07 декабря 2010

У меня есть веб-сервис C #, который возвращает данные двумерного массива. Поскольку веб-сервисы не могут возвращать многомерные данные, я сделал так, чтобы он возвращал неровный массив.

[OperationContract]
object[][] WSGetData();

У меня есть библиотека классов COM Visible C #. Это тонкий слой, который использует эту услугу и предоставляет ее клиентам Excel VBA. (По определенным причинам мы решили не идти через VSTO или маршруты Web Services References Toolkit.)

class Wrapper
{
    public object[][] GetData()
    {
        return WSproxy.WSGetData(); //Calling the webservice method
    }
}

Я вызываю метод в VBA, как показано ниже.

Dim data as Variant
data = wrapperObj.GetData();

Я получаю ошибку несоответствия типов.

Когда я изменил класс Wrapper для преобразования вывода «неровного массива» веб-службы в многомерный вывод (т. Е. Object [,]) перед возвратом в VBA, он работает нормально. Но я не хочу этого делать, потому что это повлияет на производительность, так как мы будем передавать огромные данные.

Каков наилучший способ достичь этого, пожалуйста. Спасибо за любые указания ..

1 Ответ

1 голос
/ 08 мая 2011

Зубчатые массивы возможны.Я не думаю, что VBA нравится, как вы объявили свой вариант.Вам, вероятно, нужно объявить его как массив Variant.Смотрите пример ниже:

Sub Test()
    Dim oneToTen(9) As String 'Array 1
    Dim tenTo21(10) As String  'Array 2
    Dim twentyTwoTo23(1) As String  'Array 3
    Dim vArray() As Variant   'Jagged Array (array of arrays)

    'Fill test data in the three arrays
    Dim iCount As Integer
    For iCount = 0 To 9
        oneToTen(iCount) = iCount + 1
    Next iCount
    For iCount = 0 To 10
        tenTo21(iCount) = iCount + 11
    Next iCount
    For iCount = 0 To 1
        twentyTwoTo23(iCount) = iCount + 22
    Next iCount

    'If you uncomment the code below, you will get a type mismatch (probably for the same reason you get it in your webservice)
    'vArray1(0) = oneToTen

    'However, if you REDIM the variant array, you can then set each array into the variant
    Const JAGGED_ARRAY_SIZE = 2 'This will probably require another property on your webservice to see how big your Jagged Array is (e.g.  wrapperObj.GetJaggedArraySize())
    ReDim vArray(JAGGED_ARRAY_SIZE)

    vArray(0) = oneToTen
    vArray(1) = tenTo21
    vArray(2) = twentyTwoTo23

    'Now loop through the jagged array:
    Dim outerLoop As Integer
    Dim innerLoop As Integer
    Dim vCurrentArray As Variant

    'Loop through the arrays in the array and print out the data
    For outerLoop = 0 To JAGGED_ARRAY_SIZE
        For innerLoop = 0 To UBound(vArray(outerLoop))
            Debug.Print "Outer Loop:  " & outerLoop & "  Inner Loop:  " & innerLoop & "  Array Value:  " & vArray(outerLoop)(innerLoop)
        Next innerLoop
    Next outerLoop

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