我目前正在运行Windows服务,该服务每天运行两次,在我对代码进行大量更改之前,它运行得很顺利。经过我所做的更改之后,我在服务日志中遇到了一个问题,该问题在第一天第二天就显示“对象引用未设置为对象的实例”顺利运行(不知道如何正确地说,但是希望你们能理解)
这个问题可能而且可能只是在我进行更改之后发生的。但是它只是添加了一个功能,如果我告诉服务这样做(通过更改app.config中的值),我会立即将其设置为false
这是我之前提到的问题所在,无论如何,所做的更改只是添加UpdateAllBookingJourneyDetails
函数,如果我在{{1中将execute
的值设置为True
}}
app.config
和对象引用问题总是恰好在这一行,并且在启动服务后的第二天执行总是会遇到该问题。
Public Sub RunProcess(ByVal CancellationTime As DateTime, ByVal EmailTime As DateTime, ByVal endCancelation As DateTime, ByVal stopSend As DateTime)
Dim ConnStr As String = System.Configuration.ConfigurationManager.AppSettings("DBConnectionGBS").ToString()
Dim execute As Boolean = Convert.ChangeType(ConfigurationManager.AppSettings("execute").ToString(), TypeCode.Boolean)
Dim daysforcancel As Integer = Convert.ToInt32(ConfigurationManager.AppSettings("daysforcancel").ToString())
Dim daysforsync As Integer = Convert.ToInt32(ConfigurationManager.AppSettings("daysforcancel").ToString())
Dim i As Integer = 0
Dim msg As String = String.Empty
Dim datecompare As Date = Today.AddDays(daysforcancel)
Dim datecompareupdate As Date = Today.AddDays(daysforsync)
Dim checkupdate As Boolean = False
Dim timeNow As DateTime = DateTime.Parse(TimeString)
Dim startCancelation As Boolean = timeNow > CancellationTime AndAlso timeNow < endCancelation
Dim sendEmail As Boolean = timeNow > EmailTime AndAlso timeNow < stopSend
Try
Dim eWS As ProcessService.ProcessServiceSoap = New ProcessService.ProcessServiceSoapClient("ProcessServiceSoap1")
Dim AllTransaction As List(Of BookingTransactionMain) = New List(Of BookingTransactionMain)()
AllTransaction = gettransactiondetail.GetAllBK_TRANSMAINBookingExpiry("", "", "", "1,2", False, 2, 14, 1)
If AllTransaction IsNot Nothing AndAlso AllTransaction.Count > 0 Then
Dim UpdatedData As Integer = 0
Dim Remindersend As Integer = 0
Dim SynchData As Integer = 0
Dim synced As Boolean = False
For Each Trans As BookingTransactionMain In AllTransaction
Dim lessthan7day As Boolean = False
Dim emailnotification As String = ""
Dim SingleTransaction As List(Of ABS.Logic.GroupBooking.Booking.ListTransaction) = New List(Of ABS.Logic.GroupBooking.Booking.ListTransaction)()
SingleTransaction = gettransactiondetail.GetTransactionDetails(Trans.TransID)
Dim lstTrans As ABS.Logic.GroupBooking.Booking.ListTransaction = SingleTransaction(0)
Dim VoidPNRs As List(Of ABS.Logic.GroupBooking.Booking.BookingTransactionDetail) = New List(Of ABS.Logic.GroupBooking.Booking.BookingTransactionDetail)()
Dim ExpiredPNRs As List(Of ABS.Logic.GroupBooking.Booking.BookingTransactionDetail) = New List(Of ABS.Logic.GroupBooking.Booking.BookingTransactionDetail)()
lessthan7day = (Trans.STDDate.Date) <= (datecompare.Date)
checkupdate = (Trans.STDDate.Date) <= (datecompareupdate.Date)
If execute AndAlso startCancelation AndAlso checkupdate Then
synced = UpdateAllBookingJourneyDetails(lstTrans, lstTrans.AgentUserName.ToString(), lstTrans.AgentID.ToString(), VoidPNRs, ExpiredPNRs, True)
If synced = False Then
objSendEmail.SaveLog(EmailBase.SaveLogType.Synchronation, "Fail to Get Latest Update for Transaction : " & lstTrans.TransID & vbCrLf)
ElseIf synced = True Then
EventWriter.WriteEvent(EventWriter.EnumEventLogType.AuditLog, "UpdateLatesDetails")
objSendEmail.SaveLog(EmailBase.SaveLogType.Synchronation, " Synchronization for Transaction : " & vbCrLf &
"PNR: " & Trans.RecordLocator & vbCrLf &
"TransID: " & Trans.TransID & vbCrLf &
"Journey: " & Trans.Journeys & vbCrLf &
"Upload Status: " & Trans.PassengerStatus & vbCrLf &
"Paid Status: " & Trans.PaidStatus & vbCrLf &
"Balance Due: " & Trans.CollectedAmt & vbCrLf &
"Departure Date: " & Trans.STDDate & vbCrLf &
"Expiry Date: " & Trans.ExpiryDate & vbCrLf)
SynchData += 1
End If
End If
msg = gettransactiondetail.GetLatestReminderbyTransID(Trans.TransID)
If msg <> "" Then
emailnotification = True.ToString()
Else
emailnotification = False.ToString()
End If
objSendEmail.SaveLog(EmailBase.SaveLogType.Transaction, " All Transaction : " & vbCrLf &
"PNR: " & Trans.RecordLocator & vbCrLf &
"TransID: " & Trans.TransID & vbCrLf &
"Journey: " & Trans.Journeys & vbCrLf &
"Upload Status: " & Trans.PassengerStatus & vbCrLf &
"Paid Status: " & Trans.PaidStatus & vbCrLf &
"Email Notification: " & emailnotification & vbCrLf &
"Balance Due: " & Trans.CollectedAmt & vbCrLf &
"Departure Date: " & Trans.STDDate & vbCrLf &
"Expiry Date: " & Trans.ExpiryDate & vbCrLf)
If msg = "" AndAlso sendEmail Then
Try
Dim request As ProcessService.ResendReminderRequest = New ProcessService.ResendReminderRequest
Dim body As ProcessService.ResendReminderRequestBody = New ProcessService.ResendReminderRequestBody
body.transID = Trans.TransID
request.Body = body
eWS.ResendReminder(request)
EventWriter.WriteEvent(EventWriter.EnumEventLogType.AuditLog, "UpdateLatesDetails")
objSendEmail.SaveLog(EmailBase.SaveLogType.Reminder, " Email Notification for Transaction : " & vbCrLf &
"PNR: " & Trans.RecordLocator & vbCrLf &
"TransID: " & Trans.TransID & vbCrLf &
"Journey: " & Trans.Journeys & vbCrLf &
"Upload Status: " & Trans.PassengerStatus & vbCrLf &
"Paid Status: " & Trans.PaidStatus & vbCrLf &
"Balance Due: " & Trans.CollectedAmt & vbCrLf &
"Departure Date: " & Trans.STDDate & vbCrLf &
"Expiry Date: " & Trans.ExpiryDate & vbCrLf)
Remindersend += 1
Catch ex As Exception
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "Cancellation")
objSendEmail.SaveLog(EmailBase.SaveLogType.Reminder, "ResendReminder RunProcess-- " & ex.ToString() & vbCrLf &
"Failed to send email" & vbCrLf)
End Try
ElseIf msg <> "" AndAlso startCancelation AndAlso Trans.BalanceDue <> 0 AndAlso lessthan7day AndAlso Trans.Journeys.ToLower.Contains("is available") AndAlso Trans.PassengerStatus.ToLower.Contains("pending") AndAlso Not Trans.PaidStatus.ToLower.Contains("paidinfull") Then
EventWriter.WriteEvent(EventWriter.EnumEventLogType.AuditLog, "UpdateLatesDetails")
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, " Cancellation Candidate for Transaction : " & vbCrLf &
"PNR: " & Trans.RecordLocator & vbCrLf &
"TransID: " & Trans.TransID & vbCrLf &
"Journey: " & Trans.Journeys & vbCrLf &
"Upload Status: " & Trans.PassengerStatus & vbCrLf &
"Paid Status: " & Trans.PaidStatus & vbCrLf &
"Email Notification: " & emailnotification & vbCrLf &
"Balance Due: " & Trans.CollectedAmt & vbCrLf &
"Departure Date: " & Trans.STDDate & vbCrLf &
"Expiry Date: " & Trans.ExpiryDate & vbCrLf)
Try
If execute Then
If CancelProcess(Trans.TransID) Then
UpdatedData += 1
EventWriter.WriteEvent(EventWriter.EnumEventLogType.AuditLog, "UpdateLatesDetails")
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation,
"Cancellation Date: " & DateTime.Now.ToString() & vbCrLf &
"Cancellation Success" & vbCrLf)
Else
EventWriter.WriteEvent(EventWriter.EnumEventLogType.AuditLog, "UpdateLatesDetails")
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, " Cancellation Failed" & vbCrLf)
End If
End If
Catch
EventWriter.WriteEvent(EventWriter.EnumEventLogType.AuditLog, "UpdateLatesDetails")
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, " Cancellation Failed" & vbCrLf)
Finally
msg = ""
lessthan7day = False
End Try
'EventWriter.WriteEvent(EventWriter.EnumEventLogType.AuditLog, "UpdateLatesDetails")
'objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, " Payment/Upload passenger Reminder sending for Transaction : " & lstTrans.TransID)
End If
Next
If UpdatedData = 0 AndAlso startCancelation Then
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "Cancellation")
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, "Cancellation RunProcess-- " & vbCrLf & "No Cancelation Today" & vbCrLf)
End If
If Remindersend = 0 AndAlso sendEmail Then
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "Cancellation")
objSendEmail.SaveLog(EmailBase.SaveLogType.Reminder, "ResendReminder RunProcess-- " & vbCrLf & "No Email Sent Today" & vbCrLf)
End If
If SynchData = 0 AndAlso startCancelation Then
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "Cancellation")
objSendEmail.SaveLog(EmailBase.SaveLogType.Synchronation, "Synchronization RunProcess-- " & vbCrLf & "No Synchronization Today" & vbCrLf)
End If
Else
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "Cancellation")
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, "GetAllBK_TRANSMAINBookingExpiry RunProcess-- " & vbCrLf &
"No Transaction is obtained from query" & vbCrLf)
End If
'for daily execution
Catch ex As Exception
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "Cancellation", ex)
If startCancelation Then
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, "Cancellation RunProcess-- " + ex.ToString + vbCrLf)
ElseIf sendEmail Then
objSendEmail.SaveLog(EmailBase.SaveLogType.Reminder, "ResendReminder RunProcess-- " + ex.ToString + vbCrLf)
ElseIf checkupdate Then
objSendEmail.SaveLog(EmailBase.SaveLogType.Synchronation, "Synchronization RunProcess-- " + ex.ToString + vbCrLf)
End If
Finally
gettransactiondetail = Nothing
ProcessDone = True
End Try
End Sub
这是GetAllBK_TRANSMAINBookingExpiry函数代码
AllTransaction = gettransactiondetail.GetAllBK_TRANSMAINBookingExpiry("", "", "", "1,2", False, 2, 14, 1)
如果有人遇到相同的问题,请提供任何建议,因为就像我之前说的那样,它可以平稳运行以每日执行,直到我添加Public Function GetAllBK_TRANSMAINBookingExpiry(ByVal AgentID As String, ByVal AgentName As String, ByVal RecordLocator As String, ByVal Status As String, ByVal Optional GetUptoDate As Boolean = False, ByVal Optional DayBeforeExpiry As Integer = 0, ByVal Optional IntervalDays As Integer = 0, ByVal Optional Sync As Integer = 0) As List(Of BookingTransactionMain)
Try
Dim ConnStr As String = System.Configuration.ConfigurationManager.AppSettings("DBConnectionGBS").ToString()
Dim objSQL As SQLControl = New SQLControl
objSQL.ClearFields()
objSQL.ClearCondtions()
Dim dt As DataTable = New DataTable()
Dim dateValue As DateTime
Dim numValue As Decimal
Dim strSQL As String = String.Empty
Dim strFilter As String = String.Empty
Dim strOrder As String = String.Empty
'Dim ApiBook As ABS.Navitaire.APIBooking = New ABS.Navitaire.APIBooking("")
Dim apibooking As APIBooking = New APIBooking()
Dim psDomain As String = ""
Dim psName As String = ""
Dim psPwd As String = ""
psDomain = ConfigurationManager.AppSettings("signature_domain").ToString()
psName = ConfigurationManager.AppSettings("signature_username").ToString()
psPwd = ConfigurationManager.AppSettings("signature_password").ToString()
Dim objBookingTransactionMain As BookingTransactionMain = New BookingTransactionMain
Dim objListBookingTransMain As List(Of BookingTransactionMain) = New List(Of BookingTransactionMain)()
Dim SessionID As String = apibooking.AgentLogon("Public", psDomain, psName, psPwd)
Dim response As ABS.Navitaire.BookingManager.GetBookingResponse = New ABS.Navitaire.BookingManager.GetBookingResponse()
Using connection = New SqlConnection(ConnStr)
connection.Open()
If GetUptoDate = True Then
strFilter = " AND tm.SyncLastUpd > DATEADD(MINUTE, -60, GETDATE()) "
End If
strFilter += String.Format(" AND ( BK_TRANSDTL.DepartureDate > CAST(GETDATE() AS DATE) AND BK_TRANSDTL.DepartureDate <= CAST(DATEADD(DAY, {0}, GETDATE()) AS DATE) ) ", IntervalDays + 1)
strSQL = "SELECT BK_TRANSDTL.RecordLocator, BK_TRANSDTL.Origin as Origin," & " tm.ExpiryDate, " & " BK_TRANSDTL.DepartureDate as STDDate, tm.CollectedAmt, " &
" ag.ContactFirstName + ' ' + ag.ContactLastName AS FullName, " & " CASE " & " WHEN tm.Transstatus = '0' THEN 'Pending' " & " WHEN tm.Transstatus = '1' THEN 'Pending' " &
" WHEN tm.Transstatus = '2' AND tm.NeedPaymentStatus = '1' THEN 'Pending' " & " WHEN tm.Transstatus = '3' AND tm.NeedPaymentStatus = '1' THEN 'Pending' " &
" WHEN tm.Transstatus = '2' AND tm.NeedPaymentStatus = '0' THEN 'Pending for Passenger Upload' " &
" WHEN tm.Transstatus = '3' AND tm.NeedPaymentStatus = '0' THEN 'Confirmed' " & " WHEN tm.Transstatus IN('4','6','7') THEN 'Cancelled' " & " END AS 'Status', " &
" tm.TransID, tm.AgentID, tm.TransTotalAmt, tm.SyncLastUpd, ag.Email, ag.Username, tm.BookingDate, tm.PaymentAmtEx3, " & " (SELECT TOP (1) SyncCreate " &
" FROM AG_EMAIL WHERE(TransID = tm.TransID) AND(EmailType IN(3, 6))" & " AND(SyncCreate > DATEADD(DAY, -2, tm.curreminderdate)) ORDER BY SyncCreate DESC) AS PaymentDateEx3 " &
" FROM BK_TRANSMAIN AS tm " & " INNER JOIN AG_PROFILE AS ag WITH(NOLOCK) ON tm.AgentID = ag.AgentID " & " INNER JOIN BK_TRANSDTL ON tm.TransID = BK_TRANSDTL.TransID " &
" WHERE(tm.TransStatus IN('1', '2', '3') AND tm.NeedPaymentStatus = '1') " & strFilter &
" AND tm.CollectedAmt > 0 AND LEN(BK_TRANSDTL.RecordLocator) >= 6 AND tm.IsOverride = 1 " &
" GROUP BY BK_TRANSDTL.RecordLocator, tm.TransStatus, tm.NeedPaymentStatus, tm.CollectedAmt, " &
" tm.ExpiryDate, BK_TRANSDTL.DepartureDate, tm.TransID, tm.AgentID, tm.TransTotalAmt, tm.SyncLastUpd, ag.Email, ag.Username, tm.BookingDate, " &
" ag.ContactFirstName, ag.ContactLastName, tm.curreminderdate, tm.PaymentAmtEx3, tm.IsOverride, tm.STDDate, tm.PaymentAmtEx3, BK_TRANSDTL.DepartureDate, BK_TRANSDTL.Origin " &
" ORDER BY tm.Transstatus, BK_TRANSDTL.DepartureDate, tm.ExpiryDate ,tm.STDDate "
Dim cmd As SqlCommand = New SqlCommand(strSQL, connection)
Dim da As SqlDataAdapter = New SqlDataAdapter(cmd)
da.Fill(dt)
connection.Close()
If dt IsNot Nothing AndAlso dt.Rows.Count > 0 Then
For Each drRow As DataRow In dt.Rows
Dim BalanceDue As Decimal = 0
Dim PaidStatus As String = ""
Dim PassengerStatus As String = ""
Dim Journeys As String = ""
Dim dtDtl As DataTable = New DataTable()
Dim strSQLDtl As String = String.Format("SELECT DISTINCT RecordLocator FROM BK_TRANSDTL WHERE TransID = '{0}' ", CStr(drRow("TransID")))
connection.Open()
cmd = New SqlCommand(strSQLDtl, connection)
da = New SqlDataAdapter(cmd)
da.Fill(dtDtl)
connection.Close()
If dtDtl IsNot Nothing AndAlso dtDtl.Rows.Count > 0 Then
For Each drRowDtl As DataRow In dtDtl.Rows
response = apibooking.getbookingresponse(CStr(drRowDtl("RecordLocator")), SessionID)
If response.Booking IsNot Nothing Then
BalanceDue += CDec(response.Booking.BookingSum.BalanceDue)
PaidStatus = PaidStatus & response.Booking.RecordLocator & " is " & response.Booking.BookingInfo.PaidStatus.ToString() & " ; "
If (response.Booking.Passengers.Where(Function(x) x.Names.Where(Function(y) y.FirstName.ToUpper().Contains("TBA")).Count() >= 0).Count() <= 0) Then
PassengerStatus = PassengerStatus & response.Booking.RecordLocator & " is Already Upload ; "
Else
PassengerStatus = PassengerStatus & response.Booking.RecordLocator & " is Pending Upload ; "
End If
If (response.Booking.Journeys.Count() > 0) Then
Journeys = Journeys & "Journeys for " & response.Booking.RecordLocator & " is Available ; "
Else
Journeys = Journeys & "Journeys for " & response.Booking.RecordLocator & " is Not Available ; "
End If
End If
Next
End If
objBookingTransactionMain = New BookingTransactionMain()
objBookingTransactionMain.TransID = CStr(drRow("TransID"))
objBookingTransactionMain.AgentID = CStr(drRow("AgentID"))
objBookingTransactionMain.Status = drRow("Status").ToString()
objBookingTransactionMain.BookingDate = CType(drRow("BookingDate"), DateTime)
If DateTime.TryParse(drRow("ExpiryDate").ToString(), dateValue) Then objBookingTransactionMain.ExpiryDate = CType(drRow("ExpiryDate"), DateTime)
If DateTime.TryParse(drRow("STDDate").ToString(), dateValue) Then objBookingTransactionMain.STDDate = CType(drRow("STDDate"), DateTime)
objBookingTransactionMain.AgentName = drRow("FullName").ToString()
objBookingTransactionMain.DueAmt = CDec(drRow("TransTotalAmt")) - CDec(drRow("CollectedAmt"))
objBookingTransactionMain.CollectedAmt = CDec(drRow("CollectedAmt"))
objBookingTransactionMain.TransTotalAmt = CDec(drRow("TransTotalAmt"))
If DateTime.TryParse(drRow("SyncLastUpd").ToString(), dateValue) Then objBookingTransactionMain.SyncLastUpd = CType(drRow("SyncLastUpd"), DateTime)
If DateTime.TryParse(drRow("PaymentDateEx3").ToString(), dateValue) Then objBookingTransactionMain.PaymentDateEx3 = CType(drRow("PaymentDateEx3"), DateTime)
If Decimal.TryParse(drRow("PaymentAmtEx3").ToString(), numValue) Then objBookingTransactionMain.PaymentAmtEx3 = CDec(drRow("PaymentAmtEx3"))
objBookingTransactionMain.RecordLocator = drRow("RecordLocator").ToString()
objBookingTransactionMain.PaidStatus = CStr(PaidStatus)
objBookingTransactionMain.PassengerStatus = CStr(PassengerStatus)
objBookingTransactionMain.BalanceDue = CDec(BalanceDue)
objBookingTransactionMain.Journeys = CStr(Journeys)
objBookingTransactionMain.Origin = CStr(drRow("Origin"))
objListBookingTransMain.Add(objBookingTransactionMain)
Next
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, "GetAllBK_TRANSMAINBookingExpiry RunProcess-- Count" + objListBookingTransMain.Count.ToString + vbCrLf)
Return objListBookingTransMain
Else
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "")
objSendEmail.SaveLog("BK_TRANSMAIN does not exist." + vbCrLf)
Return Nothing
'Throw New ApplicationException("BK_TRANSMAIN does not exist.")
End If
End Using
Catch ex As Exception
EventWriter.WriteEvent(EventWriter.EnumEventLogType.ErrorLog, "GetTransactionDetail", ex)
objSendEmail.SaveLog(EmailBase.SaveLogType.Cancellation, "GetAllBK_TRANSMAINBookingExpiry RunProcess-- " + ex.ToString + vbCrLf)
Return Nothing
Finally
objSQL.Dispose()
End Try
End Function
为止,也许
ps:对不起,我的英语不好,谢谢