У меня консольное приложение VB.NET 3.5 sp1, работающее на Windows XP sp3 из командного файла:
"D:\Program Files\PartsDepotJob\PartsDepotJob.exe" >> "D:\Program Files\PartsDepotJob\partdepot.log.txt"
Вывод выглядит следующим образом:
2.10.2009 9:03:19
Обработка заказа на поставку: 2100 в 002
Создано OE # 135
Обработка заказа на поставку: 2100 в 003
Создано OE # 136
Совершено
10.02.2009 9:03:30
Обработка заказа на поставку: 2100 в 002
Создано OE # 137
Обработка заказа на поставку: 2100 в 003
Создано OE # 138
Совершено
Однако, когда я запускаю ту же самую вещь на моем клиенте в Windows 2003 sp2 (также с .NET 3.5 sp1), вывод искажается следующим образом:
02.09.2009 16:03:37
Совершено
9.02.2009 16:04:06
Совершено
09.02.2009 16:11:01
Совершено
9.02.2009 4:30:23
Обработка заказа на поставку: 1649400 в 702
Создано OE #
01.01.1900 16:30:26Создано оригинальное оборудование # 49
01.01.1900 16:30:26 PM Обработка заказа на поставку: 1649500 в 702
Создано OE # 49
01.01.1900 16:30:28Создано оригинальное оборудование # 50
01.01.1900 4:30:28 PMDONE
т. Е. Иногда CrLf удаляется, а на выходе иногда появляется префикс 1/1/1900 {time}.
Есть идеи о том, что может вызвать это?
Соответствующий код следующий:
Imports Wisys.AllSystem
Imports Wisys.Oe
Imports Wisys.Po
Imports System.Configuration
Imports System.Data
Imports System.Linq
Public Class clsPartsDepot
Private wsConn As Wisys.AllSystem.ConnectionInfo = Nothing
Private wsPartDepotSalesOrd As Wisys.Oe.OrderEntryTables = Nothing
Public Function ProcessPartDepotOrders() As Boolean
Dim errMsg As String = ""
Try
Console.WriteLine(Now().ToString)
''//sendBadPOLineEmailtoDepot("test")
Dim dsPO As New Data.DataSet
Dim dbName As String = ""
Dim dbServer As String
Dim partDepotDbName As String = ConfigurationManager.AppSettings("partDepotDbName")
Dim partDepotDbServer As String = ConfigurationManager.AppSettings("partdepotDBserver")
Dim KeyName As String = ""
Dim billToCompany As String ''//, billtoCompAddr1 As String
Dim dtBillTo As DataTable
Dim i As Integer = 1
Dim appkeyQry = From key In ConfigurationManager.AppSettings Where key Like "CompanyDbName*" Select key
''//for each company database look for PO's
For Each KeyName In appkeyQry
dbName = ConfigurationManager.AppSettings(KeyName)
dbServer = ConfigurationManager.AppSettings("CompanyDbServer" & i)
billToCompany = ConfigurationManager.AppSettings(dbName)
dtBillTo = GetCustomer(billToCompany, partDepotDbName, partDepotDbServer)
If dtBillTo.Rows.Count = 0 Then
Throw New Exception("Customer record for company database '" & dbName & "' not found in the parts depot!")
End If
''//billtoCompAddr1 = dtBillTo.Rows(0)("cmp_fadd1")
''//get all the unprocessed, printed PO's from the current company.
dsPO = GetPoDataset(dbName, dbServer)
If IsNothing(dsPO) Then
Console.WriteLine("Error processing part depot: " & errMsg)
Exit Function
End If
Dim itemNum As String, qtyOrd As Double, requestDate As Date, promiseDate As Date, lineNum As String, itemPrice As Double
Dim errNum As Integer = 0
Dim poNum As String = ""
''//for each unprocessed, printed PO in the current company
For Each dr As DataRow In dsPO.Tables(0).Rows
If poNum <> dr("ord_no") Then
Console.WriteLine("Processing PO#: " & dr("ord_no") & " in " & dbName)
If Not poNum = "" Then 'for first run don't close it, not open
wsConn.CloseWisysConnection(TrxEnums.TransactionAction.Commit, errMsg)
wsConn.Dispose()
wsConn = Nothing
End If
wsConn = New Wisys.AllSystem.ConnectionInfo
OpenWiSysConn(partDepotDbName, partDepotDbServer, True)
If Not poNum = "" Then 'for first run don't Dispose it; already equal to nothing
If Not IsNothing(wsPartDepotSalesOrd) Then wsPartDepotSalesOrd.Dispose()
wsPartDepotSalesOrd = Nothing
End If
wsPartDepotSalesOrd = New Wisys.Oe.OrderEntryTables
wsPartDepotSalesOrd.Connection(wsConn, errMsg)
With wsPartDepotSalesOrd.OrderHeader
.UserName = My.User.Name
.Ship_to_name = If(IsDBNull(dr("cmp_name")), "", dr("cmp_name"))
.Ship_to_addr_1 = If(IsDBNull(dr("cmp_fadd1")), "", dr("cmp_fadd1"))
.Ship_to_addr_2 = If(IsDBNull(dr("cmp_fadd2")), "", dr("cmp_fadd2"))
.Ship_to_addr_3 = If(IsDBNull(dr("cmp_fadd3")), "", dr("cmp_fadd3"))
.Ship_to_addr_4 = If(IsDBNull(dr("cmp_fcity")), "", dr("cmp_fcity")) & " , " & _
If(IsDBNull(dr("StateCode")), "", dr("StateCode"))
.Ship_to_country = If(IsDBNull(dr("cmp_fcounty")), "", dr("cmp_fcounty"))
.Oe_po_no = dr("ord_no")
End With
''//wsPartDepotSalesOrd.OrderHeader.Status 'readonly
errNum = wsPartDepotSalesOrd.OrderHeader.Insert(TrxEnums.OeOrderTypeEnum.Order, "", billToCompany, "", dr("ord_dt"), errMsg)
If errNum <> 0 Then
Console.WriteLine("Error Creating OE header:" & errMsg)
Else
Console.WriteLine("Created OE#" & wsPartDepotSalesOrd.OrderHeader.Ord_no)
End If
End If
poNum = dr("ord_no")
''//if error then skip to the next loop iteration until the next PO # and it gets inserted ok
If errNum <> 0 Then
Continue For
End If
lineNum = If(IsDBNull(dr("line_no")), Now(), dr("line_no"))
itemNum = dr("item_no").ToString
qtyOrd = If(IsDBNull(dr("qty_ordered")), 0, CDbl(dr("qty_ordered")))
requestDate = If(IsDBNull(dr("request_dt")), Now(), dr("request_dt"))
promiseDate = If(IsDBNull(dr("promise_dt")), Now(), dr("promise_dt"))
itemPrice = If(IsDBNull(dr("price")), 0, dr("price"))
If itemNum.Length > 0 And qtyOrd <> 0 Then
CreateLine(wsPartDepotSalesOrd, itemNum, qtyOrd, 0, requestDate, requestDate, promiseDate, itemPrice, poNum)
''//mark as processed, even if above fails. any lines that fail will be added to SO in parts depot by hand.
markPoLineAsProcessed(dbName, dbServer, poNum, lineNum)
End If
Next
poNum = ""
i = +1
If Not IsNothing(wsConn) Then
wsConn.CloseWisysConnection(TrxEnums.TransactionAction.Commit, errMsg)
wsConn.Dispose()
End If
If Not IsNothing(wsPartDepotSalesOrd) Then wsPartDepotSalesOrd.Dispose()
wsConn = Nothing
wsPartDepotSalesOrd = Nothing
Next
Console.WriteLine("DONE")
Catch ex As Exception
Console.WriteLine("Exception processing part depot: " & ex.Message)
Finally
Try
''//cleanup
If Not IsNothing(wsPartDepotSalesOrd) Then
wsPartDepotSalesOrd.Dispose()
wsPartDepotSalesOrd = Nothing
End If
If Not IsNothing(wsConn) Then
wsConn.CloseWisysConnection(TrxEnums.TransactionAction.Commit, errMsg)
wsConn.Dispose()
wsConn = Nothing
End If
Catch ex As Exception
Console.WriteLine("Exception exiting part depot: " & ex.Message)
End Try
End Try
End Function
Private Function GetCustomer(ByVal CustomerNum As String, ByVal db As String, ByVal server As String) As DataTable
Dim cn As New SqlClient.SqlConnection
Dim cmd As New SqlClient.SqlCommand
Dim da As New SqlClient.SqlDataAdapter
Dim ds As New DataSet
Try
cn.ConnectionString = "Persist Security Info=False;Integrated Security=true;Initial Catalog=" & db & ";server=" & server
cn.Open()
cmd = cn.CreateCommand
cmd.Parameters.Add(New SqlClient.SqlParameter("@cusnum", CustomerNum))
cmd.CommandText = "select cmp_name,cmp_fadd1,coalesce(debnr,crdnr) as CusNum from dbo.cicmpy where ltrim(debnr) = @cusnum or ltrim(crdnr) = @cusnum"
cmd.CommandType = CommandType.Text
da.SelectCommand = cmd
da.Fill(ds)
If ds.Tables.Count > 0 Then
Return ds.Tables(0)
End If
Return Nothing
Finally
If Not IsNothing(cmd) Then cmd.Dispose()
If Not IsNothing(cn) Then cn.Dispose()
If Not IsNothing(da) Then da.Dispose()
End Try
End Function
Private Function GetPoDataset(ByVal db As String, ByVal server As String) As DataSet
Dim cn As New SqlClient.SqlConnection
Dim ds As New DataSet
Dim dsa As New SqlClient.SqlDataAdapter
Dim cmd As New SqlClient.SqlCommand
Try
Static Dim SQL As String = ConfigurationManager.AppSettings("getPoforPartsDepotSQL")
cn.ConnectionString = "Persist Security Info=False;Integrated Security=true;Initial Catalog=" & db & ";server=" & server
cn.Open()
cmd.Connection = cn
cmd.CommandType = CommandType.Text
cmd.CommandText = SQL
dsa.SelectCommand = cmd
dsa.Fill(ds)
Return ds
Catch
Throw
Finally
If Not IsNothing(ds) Then ds.Dispose()
If Not IsNothing(cmd) Then cmd.Dispose()
If Not IsNothing(cn) Then cn.Close()
If Not IsNothing(cn) Then cn.Dispose()
End Try
End Function
Private Function OpenWiSysConn(ByVal dbName As String, ByVal dbServer As String, ByVal useTran As Boolean) As Boolean
Try
Dim errMsg As String = ""
wsConn.Parameters(dbServer, dbName, "MacMSS")
If wsConn.OpenWisysConnection(useTran, errMsg) <> 0 Then
Console.WriteLine("Error processing part depot: " & errMsg)
Return False
End If
Return True
Catch
Throw
End Try
End Function
Private Function CreateLine(ByVal p_oOEObj As Wisys.Oe.OrderEntryTables, ByVal partNum As String, ByVal qtyOrdered As Double, ByVal qtyToShip As Double, ByVal RequestDate As Date, ByVal RequestShipDate As Date, ByVal PromiseDate As Date, ByVal price As Double, ByVal PONum As String) As Boolean
Dim OeLine As OEORDLIN
Dim p_sRtnErrMsg As String = ""
Dim p_lRtnVal As Long
Dim p_lRtnLineNumber As Long
With p_oOEObj
''//p_lRtnVal = .OrderHeader.Read(TrxEnums.OeOrderTypeEnum.Order, p_sRtnOrder, True, True, True, p_bRtnRecFound, p_sRtnErrMsg)
OeLine = .OrderHeader.OrderLines.Add(TrxEnums.OrderLineType.InventoryItem, partNum.ToUpper, "", qtyOrdered, qtyToShip, price, price, RequestDate, PromiseDate, RequestShipDate, True, p_sRtnErrMsg)
p_lRtnVal = OeLine.Insert(p_lRtnLineNumber, p_sRtnErrMsg)
If p_lRtnVal = 0 Then
Return True
End If
Console.WriteLine("Error creating sales order line# " & p_lRtnLineNumber & ": " & p_sRtnErrMsg)
sendBadPOLineEmailtoDepot("Error creating sales order line for PO# " & PONum & " becuase of an error: " & p_sRtnErrMsg)
Return False
End With
End Function
Private Function markPoLineAsProcessed(ByVal DB As String, ByVal server As String, ByVal poOrdNum As String, ByVal poLineNum As String) As Boolean
Dim cn As New SqlClient.SqlConnection
Dim cmd As New SqlClient.SqlCommand
Try
Static Dim SQL As String = ConfigurationManager.AppSettings("markPoLineAsSendToDepotSQL")
cn.ConnectionString = "Persist Security Info=False;Integrated Security=true;Initial Catalog=" & DB & ";server=" & server & ";"
cn.Open()
cmd.Connection = cn
cmd.Parameters.Add(New SqlClient.SqlParameter("@poOrdNum", poOrdNum))
cmd.Parameters.Add(New SqlClient.SqlParameter("@poLineNum", poLineNum))
cmd.CommandType = CommandType.Text
cmd.CommandText = SQL
cmd.ExecuteNonQuery()
Return True
Catch
Throw
Finally
If Not IsNothing(cmd) Then cmd.Dispose()
If Not IsNothing(cn) Then cn.Dispose()
End Try
End Function
Private Function sendBadPOLineEmailtoDepot(ByVal msgText As String) As Boolean
Try
If ConfigurationManager.AppSettings("EnableSentBadPOMail").ToLower <> "true" Then Return True
Dim sMailServer As String = ConfigurationManager.AppSettings("MailServer")
Dim mySmtpClient As New System.Net.Mail.SmtpClient(sMailServer)
mySmtpClient.UseDefaultCredentials = True
mySmtpClient.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.Network
Dim sTo As String = ConfigurationManager.AppSettings("BadPOMailTo")
Dim sFrom As String = ConfigurationManager.AppSettings("BadPOMailFrom")
mySmtpClient.Send(sFrom, sTo, msgText, msgText)
Return True
Catch ex As Exception
Console.WriteLine("Exception sending sending bad PO line e-mail to depot: " & ex.Message)
Return False
End Try
End Function
End Class
Обновление: я не хочу, чтобы вывод был перезаписан, я хочу, чтобы он был добавлен. Таким образом, >> а не>
Обновление:
Перспективы одинаковые в окне консоли, т.е. если не перенаправлен в файл. Это приложение, выводящее данные в этот файл, и одновременно запускается только одно. В базе данных клиентов нет плохих данных.
Я уверен, что код между сайтами одинаков. Кроме того, я удостоверился, что нет никаких дополнительных console.write / writeline, создающих проблему.
Обновление: я пропустил какой-то код, который мог бы обновиться, я обновил фрагмент кода выше.
Обновление: я запускал процесс "вручную" на моем клиенте, поэтому я уверен, что только один был запущен. ProcessPartDepotOrders () просто вызывается один раз из sub main (), поэтому я не вижу никаких проблем с потоками.