Este debe ser simple, pero estoy teniendo problemas. El uso de eBay .Biblioteca de red, a veces ciertos campos en una respuesta se Nothing y a veces contienen un valor. Cuando se Nothing podrían simple ser representado como una cadena vacía, pero los desarrolladores decidieron regresar como Nothing así que cuando me pruebe a establecer una Cadena de valor (cuando no hay nada allí) me sale una excepción NullReferenceException, ver más abajo

Imports System
Imports System.Configuration.ConfigurationManager
Imports System.Globalization
Imports System.Threading
Imports System.Xml
Imports eBay.Service.Core.Soap
Imports eBay.Service.Core.Sdk
Imports eBay.Service.Call
Imports eBay.Service.Util
Public Class eBayOrderImportService
Private Sub ServiceWorkerThread(ByVal state As Object)
' Periodically check if the service is stopping.
Do While Not Me.stopping
' Perform main service function here...
GetLastTime()
Dim apiContext As ApiContext = GetApiContext()
Dim apiCall As GetOrdersCall = New GetOrdersCall(apiContext)
Dim orders As New OrderTypeCollection
Dim timeFilter As New TimeFilter
timeFilter.TimeFrom = lastUpdate
timeFilter.TimeTo = Date.Now
Dim lastTime As Boolean = SetLastTime()
apiCall.IncludeFinalValueFee = True
orders = apiCall.GetOrders(timeFilter, TradingRoleCodeType.Seller, OrderStatusCodeType.Completed)
Dim order As OrderType
For Each order In orders
'do order-wide stuff here
LogOrder(order)
Next
Thread.Sleep(30 * 1000)  ' Simulate some lengthy operations.
Loop
' Signal the stopped event.
Me.stoppedEvent.Set()
End Sub
Private Sub LogOrder(ByVal Order As OrderType)
Dim OrderID, AccountID, BillingFirstName, BillingLastName, _
BillingCompany, BillingEmailAddress, BillingPhone, _
BillingAddress1, BillingAddress2, BillingCity, _
BillingStateProvidence, BillingPostalCode, _
BillingCountry, ShippingFirstName, ShippingLastName, _
ShippingCompany, ShippingEmailAddress, ShippingPhone, _
ShippingAddress1, ShippingAddress2, ShippingCity, _
ShippingStateProvidence, ShippingPostalCode, _
ShippingCountry, OrderStatus, BillingStatus, _
OrderDate, ShippingMethod, SalesTax, _
PreShippingCharge, OrderDiscount, OrderTotalCharged, _
PaymentMethod, RepeatOrder, GiftCode, CouponCode, RID, _
OrderNotes, OrderChannel, IsPrinted, IsShipped, PrintDate, _
ShipDate, ActualShipCharge, DaysInTransit, DeliveryDate, _
TrackingNumber, ShippedMethod As String
OrderID = Order.OrderID
AccountID = ""
Dim name As String = If(Order.ShippingAddress.Name.ToString(), "None Given")
BillingFirstName = name.Substring(0, name.IndexOf(" "))
BillingLastName = name.Substring(name.IndexOf(" ") + 1)
BillingCompany = If(Order.ShippingAddress.CompanyName.ToString(), "")
BillingEmailAddress = If(Order.TransactionArray(0).Buyer.Email.ToString(), "")
BillingPhone = If(Order.ShippingAddress.Phone.ToString(), "")
BillingAddress1 = If(Order.ShippingAddress.Street1.ToString(), "")
BillingAddress2 = If(Order.ShippingAddress.Street2.ToString(), "")
BillingCity = If(Order.ShippingAddress.CityName.ToString(), "")
BillingStateProvidence = If(Order.ShippingAddress.StateOrProvince.ToString(), "")
BillingPostalCode = If(Order.ShippingAddress.PostalCode.ToString(), "")
BillingCountry = If(Order.ShippingAddress.CountryName.ToString(), "")
ShippingFirstName = If(BillingFirstName, "")
ShippingLastName = If(BillingLastName, "")
ShippingCompany = If(Order.ShippingAddress.CompanyName.ToString(), "")
ShippingEmailAddress = If(Order.TransactionArray(0).Buyer.Email.ToString(), "")
ShippingPhone = If(Order.ShippingAddress.Phone.ToString(), "")
ShippingAddress1 = If(Order.ShippingAddress.Street1.ToString(), "")
ShippingAddress2 = If(Order.ShippingAddress.Street2.ToString(), "")
ShippingCity = If(Order.ShippingAddress.CityName.ToString(), "")
ShippingStateProvidence = If(Order.ShippingAddress.StateOrProvince.ToString(), "")
ShippingPostalCode = If(Order.ShippingAddress.PostalCode.ToString(), "")
ShippingCountry = If(Order.ShippingAddress.CountryName.ToString(), "")
OrderStatus = If(Order.OrderStatus.ToString(), "")
BillingStatus = If(Order.OrderStatus.ToString(), "")
OrderDate = If(Order.CreatedTime.ToString("MM/DD/yyyy"), "")
If Order.TransactionArray(0).Taxes IsNot Nothing Then
Dim tmpTax As Double = 0.0
Dim tmpTrans As TransactionType
For Each tmpTrans In Order.TransactionArray
tmpTax = tmpTax + tmpTrans.Taxes.TotalTaxAmount.Value
Next
SalesTax = tmpTax.ToString()
Else
SalesTax = "0.0"
End If
ShippingMethod = If(Order.ShippingServiceSelected.ShippingService.ToString(), "")
ShippingMethod = ShippingMethod & ":" & If(Order.ShippingServiceSelected.ShippingServicePriority.ToString(), "")
OrderTotalCharged = If(Order.Total.Value.ToString(), "")
OrderChannel = "eBay"
comm = New OdbcCommand
comm.CommandText = _
"INSERT INTO Orders (OrderID, AccountID, BillingFirstName, BillingLastName, " & _
"BillingCompany, BillingEmailAddress, BillingPhone, BillingAddress1, " & _
"BillingAddress2, BillingCity, BillingStateProvidence, BillingPostalCode, " & _
"BillingCountry, ShippingFirstName, ShippingLastName, ShippingCompany, " & _
"ShippingEmailAddress, ShippingPhone, ShippingAddress1, ShippingAddress2, " & _
"ShippingCity, ShippingStateProvidence, ShippingPostalCode, ShippingCountry, " & _
"OrderStatus, BillingStatus, OrderDate, SalesTax, ShippingMethod, OrderTotalCharged, OrderChannel) " & _
"VALUES('" & OrderID & "', '" & AccountID & "', '" & BillingFirstName & "', '" & _
BillingLastName & "', '" & BillingCompany & "', '" & BillingEmailAddress & "', '" & _
BillingPhone & "', '" & BillingAddress1 & "', '" & BillingAddress2 & "', '" & BillingCity & "', '" & _
BillingStateProvidence & "', '" & BillingPostalCode & "', '" & BillingCountry & "', '" & _
ShippingFirstName & "', '" & ShippingLastName & "', '" & ShippingCompany & "', '" & _
ShippingEmailAddress & "', '" & ShippingPhone & "', '" & ShippingAddress1 & "', '" & _
ShippingAddress2 & "', '" & ShippingCity & "', '" & ShippingStateProvidence & "', '" & _
ShippingPostalCode & "', '" & ShippingCountry & "', '" & OrderStatus & "', '" & _
BillingStatus & "', '" & OrderDate & "', '" & SalesTax & "', '" & ShippingMethod & "', '" & _
OrderTotalCharged & "', '" & OrderChannel & "')"
' Dim orderResult As Integer = comm.ExecuteNonQuery()
sysLog.WriteEntry(comm.CommandText)
End Sub
End Class

No se actualiza el código por favor nota que no es la excepción es lanzada hasta que:
BillingCompany = Si(Orden.ShippingAddress.CompanyName.ToString(), «»)
se ejecuta. El Name propiedad tiene un valor, que con éxito se almacenan en su variable, mientras que Order.ShippingAddress.CompanyName se establece en Nothing (esta propiedad no existe, y a veces puede tener un valor). He actualizado el código para incluir Anthony Pegram la respuesta de los que no son de ayuda.

Todo lo que se declara correctamente, para acortar el código que les acabo de mostrar un ejemplo relevante. Considere esto dentro de un bucle para cada orden de regresar de un GetOrders (), a veces la Order.ShippingAddress.CompanyName no será nada, en estos tiempos es posible manejar como una cadena vacía? He probado el método ToString (). En otros idiomas que podría
$CompanyName = este || que;

Algo similar en VB .Neta?

OriginalEl autor Mike L. | 2012-02-12

2 Comentarios

  1. 11

    Puede utilizar If(a, b) fusionarse null a otro valor. Ejemplo:

    Dim obj as String = Nothing
    Dim foo as String = If(obj, "foo")

    La salida de foo en este ejemplo será la cadena «foo». Si usted tenía un no-null cadena asignada a obj, a continuación, foo también de referencia de esa cadena.

    Sin embargo, tengo una fuerte sensación de que su referencia nula excepción podría estar sucediendo no en la propiedad, pero en el objeto. Order o ShippingAddress podría ser null. Acceder a propiedades o métodos en una referencia null es un error. Sólo el acceso a un valor nulo por guardarlo en una variable no es un error en sí mismo.

    Si usted está recibiendo su excepción en una de estas líneas

    CompanyName = Order.ShippingAddress.CompanyName 
    State = Order.ShippingAddress.StateOrProvince

    Es porque cualquier Orden o ShippingAddress es nulo.

    Comprobar y ver si estos objetos en realidad podría devolver nada. Si es así, usted tendrá que aplicar null-comprobación alrededor de ellos antes de acceder a sus propiedades.


    Su actualización:

    No se actualiza el código por favor nota que no es la excepción es lanzada hasta que:

    BillingCompany = If(Order.ShippingAddress.CompanyName.ToString(), "")

    se ejecuta.

    Esto puede tirar porque el Orden puede ser null, ShippingAddress puede ser nulo, o CompanyName puede ser null. Es una excepción para acceder a una propiedad o a un método de una referencia nula. Si el Pedido es nulo, obtendrá un error de acceso ShippingAddress. Similarlu, si ShippingAddress es null, no se puede tener acceso CompanyName. Si CompanyName es null, no se puede llamar a ToString().

    Usted tiene que en algún momento de verificar que el objeto es null. No tengo la confianza de que alguno de ellos no será nulo. ¿? De verificación. El paso a través de su programa y observar los estados de objeto.

    Si lo hace descender a las propiedades como CompanyName siendo nulo, y si CompanyName es una cadena, omitir el método ToString() de la llamada.

    BillingCompany = If(Order.ShippingAddress.CompanyName, "")

    Si CompanyName no es una cadena, usted simplemente tiene que comparar con Nada antes de llamar al método ToString() o el acceso a una propiedad.

    voy a intentar esto, gracias
    mismo error, consulte el código actualizado…Gracias
    ha cambiado completamente el código de la pregunta. Que por lo general hace que las respuestas que han recibido ya no es útil. Hablando en general, no hay que hacerlo. Iniciar una nueva pregunta de si es necesario.
    Dicho esto, todavía se ve como usted necesita prestar atención a los consejos de las respuestas. Ya sea Order o Order.ShippingAddress podría ser null. Otros objetos que puedan ser null. O podría ser, de hecho, la cadena de propiedades que son nulos, y que son de llamar a ToString() en ellos, conseguir la excepción. Esto anula completamente la seguridad de If(a, b). Si a es nulo, If(a.ToString(), b) va a tirar. No has resaltado donde el error está produciendo, lo que nos deja adivinar. Han de cruzar el código?
    Por favor, poner un punto de ruptura donde el NRE que está sucediendo. Examinar todo de las referencias a objetos en esa línea. Ver cuál es nulo, y agregar apropiado nula cheques. Continuar recorriendo el código hasta que haya verificado que cualquier cosa que pudiera ser nulo se tiene en cuenta. Y no llamar a los métodos o propiedades de una referencia null.

    OriginalEl autor Anthony Pegram

  2. 2

    Echa un vistazo a esta línea:

    CompanyName = Order.ShippingAddress.CompanyName

    Si el CompanyName propiedad en Order.ShippingAddress.CompanyName es Nothing, ya que el código es perfectamente legal y se no desencadenar una excepción NullReferenceException. La excepción se activa, ya sea porque Order.ShippingAddress o Order en sí no es Nada. Usted consigue la excepción porque usted está tratando de buscar una propiedad específica de un objeto que no existe. Basado en el código de ejemplo es fácil ver por qué esto podría ser el caso:

    Dim Order As OrderType

    Que la línea declara una variable, pero en realidad nunca se da esa variable un valor. Order es una variable de referencia a objeto… que aún no está establecida como instancia de un objeto. Ahora parece que se puede omitir el código en el que una instancia está establecido, pero vale la pena mencionar porque si es así, es una parte básica de cómo este código se supone que funciona y tendría sentido incluir al menos un stub para que en la muestra.

    He actualizado el código, consulte la Para/Siguiente bucle que ?debe? para establecer el valor de la Orden, como se repite, y esta Orden se pasa a otro sub rutina de proceso, en realidad. Las propiedades que no están en nada, no tienen ningún problema.

    OriginalEl autor Joel Coehoorn

Dejar respuesta

Please enter your comment!
Please enter your name here