Нужна помощь в преобразовании этой одной строки кода из vb .net 2005~ в vb .net 2010 (eBay .Net SDK)

Что ж, в eBay SDK есть неплохой набор примеров, но они устарели, большинство из них не будут работать, и вы получите NullReferenceException в строке. Я был кодировщиком Windows около 5 лет (причем 5 лет назад, и знаю только .Net достаточно, чтобы обойтись. Я разрабатываю в основном крупномасштабные веб-приложения)

Это конкретное приложение опрашивает API eBay через службу Windows с заданными интервалами и обновляет базу данных SQL с отложенными заказами, которые должны быть отправлены. В этом нет необходимости, так как этот код прост и не является проблемой.

Вот строка старого кода VB .Net, имейте в виду, что IntelliSense показывает код как действительный в представлении кода.

 Dim Transactions As TransactionTypeCollection 
 Transactions = apiCall.GetSellerTransactions("1/1/2012 5:51:09 AM", "1/30/2012 5:51:09 AM")

Когда эта вторая строка кода запускается, я получаю эту ошибку:

NullReferenceException was unhandled
Object reference not set to an instance of an object.

Visual Studio предоставляет несколько советов по устранению неполадок, таких как проверка того, что устанавливаемый объект не равен NULL (ничего) перед вызовом, и использование ключевого слова New для создания нового экземпляра объекта перед вызовом метода. Например, я пробовал все комбинации этих методов:

Dim Transactions As New Transaction TypeCollection

или после того, как транзакция была определена,

Transactions = New apicall.getSellerTransaction()
    'didnt think this would work but I've tried everything

Это не помогло, а также первое не выдавало никаких дополнительных ошибок (второе, как я и предполагал, дает понять, что getSellerTransaction() не является конструктором).

Какие-либо предложения?

Спасибо за чтение длинного поста, просто хотел быть как можно тщательнее. Кстати, я использую последнюю версию eBay .NET SDK от developer.ebay.com, пытаясь выполнить getSellerTransaction. У меня были похожие проблемы при создании токенов, но это исправление было другим. Я думаю, что это синтаксическая ошибка. Спасибо за любую помощь. Я буду здесь, чтобы ответить на любые вопросы, если вам нужно больше деталей.

-Майк

Дополнительный код

Я использую простой потоковый генератор для сбора достаточного количества данных из транзакций, чтобы я знал, что они работают (когда я преодолею эту ошибку, отложенные заказы будут загружены в источник данных sql). Это также служба Windows (отсюда theServiceWorkerThread). Кроме того, демонстрационные приложения .Net, представленные в eBay SDK (по крайней мере, для GetSellerTransactions происходит сбой с тем же кодом ошибки, в том же месте)

 Private Sub ServiceWorkerThread(ByVal state As Object)
    ' Periodically check if the service is stopping.
    Do While Not Me.stopping
        ' Perform main service function here...
        Dim apiCall As GetSellerTransactionsCall = New GetSellerTransactionsCall(apiContext)

        Dim transactions As New TransactionTypeCollection

        'the line below causes the exception
        transactions = apiCall.GetSellerTransactions("1/1/2012 5:51:09 AM", "1/30/2012 5:51:09 AM")
        Dim trans As New TransactionType
        For Each trans In transactions

            Me.sysLog.WriteEntry("ItemId: " & trans.Item.ItemID)
            Me.sysLog.WriteEntry("TransId: " & trans.TransactionID)
            Me.sysLog.WriteEntry("TransPrice: " & trans.TransactionPrice.Value.ToString())
            Me.sysLog.WriteEntry("AmtPaid: " & trans.AmountPaid.Value.ToString())
            Me.sysLog.WriteEntry("qtyPurchased: " & trans.QuantityPurchased.ToString())
            Me.sysLog.WriteEntry("buyUserId; " & trans.Buyer.UserID)

        Next trans

        Thread.Sleep(60000)  ' Simulate some lengthy operations.
    Loop

    ' Signal the stopped event.
    Me.stoppedEvent.Set()
End Sub

<summary>
    Populate eBay SDK ApiContext instance with data from application configuration file
</summary>
<returns>ApiContext instance</returns>
<remarks></remarks>

 Private Function GetApiContext() As ApiContext

    'apiContext is a singleton
    'to  avoid duplicate configuration reading
    If (apiContext IsNot Nothing) Then
        Return apiContext
    Else
        apiContext = New ApiContext

        'set Api Server Url
        apiContext.SoapApiServerUrl = AppSettings("SopApiServerUrl")

        'declare new ApiCredential
        Dim apiCredential As ApiCredential = New ApiCredential
        'set Applcation settings (not needed with a User Token)
        apiCredential.ApiAccount.Application = AppSettings("AppId")
        apiCredential.ApiAccount.Certificate = AppSettings("AppCert")
        apiCredential.ApiAccount.Developer = AppSettings("DevId")

        'set our User Token
        apiCredential.eBayToken = AppSettings("UserToken")

        apiContext.ApiCredential = apiCredential

        'set eBay Site target to US
        apiContext.Site = SiteCodeType.US

        Return apiContext

    End If

End Function

person Mike L.    schedule 01.02.2012    source источник


Ответы (1)


Проблема не в том, что Transactions является Nothing, а в том, что apiCall является Nothing.

Убедитесь, что apiCall инициализировано правильным значением.

person Daniel Hilgarth    schedule 01.02.2012
comment
Dim apiCall As GetSellerTransactionsCall = New GetSellerTransactionsCall (apiContext) - person Mike L.; 01.02.2012
comment
Это имеет значение, и это правильно. Этот же код используется где-то еще, и он отлично работает. - person Mike L.; 01.02.2012
comment
@MikeL.: Даниель прав. Возможно вы не правильно настроили apiCall? Есть ли трассировка стека, связанная с нулевым эталонным исключением, которое точно сообщает вам, где находится нуль, если он находится внутри этого объекта apiCall (например, потому что вы прошли в нулевом контексте или подобном)... - person Chris; 01.02.2012
comment
@MikeL.: Хотите показать полный код между Dim apiCall As GetSellerTransactionsCall = New GetSellerTransactionsCall(apiContext) и Transactions = apiCall.GetSellerTransactions("1/1/2012 5:51:09 AM", "1/30/2012 5:51:09 AM")? - person Daniel Hilgarth; 01.02.2012
comment
хорошо, есть код и некоторые примечания (я прокомментировал инструкцию, которая вызывает ошибку) - person Mike L.; 01.02.2012
comment
@MikeL.: Как заметил Крис, возможно, исключение происходит внутри библиотеки, потому что apiContext - это Nothing. Пожалуйста, проверьте. Кроме того, у вас могут возникнуть проблемы с несколькими потоками, работающими параллельно... - person Daniel Hilgarth; 01.02.2012
comment
На самом деле, у меня есть функция GetApiContext(), которая вызывается, чтобы дать ApiContext значение... я снова обновил код - person Mike L.; 01.02.2012
comment
ЭТО... пропустил эту строку Dim apiContext As ApiContext = GetApiContext() непосредственно перед Dim apiCall As GetSellerTransactionsCall = New GetSellerTransactionsCall(apiContext), дайте мне посмотреть, исправит ли это (так и должно быть) Извините, я всю ночь кодировал - person Mike L.; 01.02.2012
comment
Это исправило это. Спасибо за вашу помощь, поскольку комментарии здесь решили проблему и предложили понимание других проблем, которые могут возникнуть у людей с той же ошибкой, я выбрал этот ответ как принятый. - person Mike L.; 01.02.2012