我有一个从批处理文件在Windows XP sp3上运行的VB.NET 3.5 sp1控制台应用程序:
"D:\Program Files\PartsDepotJob\PartsDepotJob.exe" >> "D:\Program Files\PartsDepotJob\partdepot.log.txt"
输出如下所示:
2/10/2009 9:03:19上午 处理PO#:2100中的2100 创建了OE#135
处理PO#:2100年003年 创建了OE#136
DONE
2/10/2009 9:03:30上午 处理PO#:2100中的2100 创建了OE#137
处理PO#:2100年003年 创建了OE#138
DONE
然而,当我在我的客户端上运行Windows 2003 sp2(也是w / .NET 3.5 sp1)框时,输出会出现乱码,如下所示:
2/9/2009 4:03:37 PM
DONE
2/9/2009 4:04:06 PM
DONE
2/9/2009 4:11:01 PM
DONE
2/9/2009 4:30:23 PM
处理PO#:1649400在702
创建了OE#
1/1/1900 4:30:26 PMCreated OE#49
1/1/1900 4:30:26 PMProcessing PO#:1649500 in 702
创建了OE#49
1/1/1900 4:30:28 PMCreated OE#50
1/1/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
更新:我不希望覆盖输出,我想要附加。因此&gt;&gt;而不是&gt;
更新: 控制台窗口中的前景相同,即。如果没有重定向到文件。这是输出到此文件的应用程序,一次只运行一个。客户端数据库中似乎没有任何错误数据。
我确信网站之间的代码是一样的。另外,我确保没有额外的console.write / writeline创建问题。
更新:我错过了一些可能相关的代码,我已经更新了上面的代码片段。
更新:我一直在我的客户端“手动”运行这个过程,所以我确定只有一个正在运行。 ProcessPartDepotOrders()只是从sub main()调用一次,所以我看不出有任何线程问题。
答案 0 :(得分:1)
使用较新的If
而不是IIf
做得很好。但是,您的代码中还有一些其他构造仍然是来自vb6的回调。最大的是新的AndAlso运算符允许使用真正的控制/中断样式循环结构。在.Net中处理对象后也没有必要设置为Nothing,您可以使用Using
关键字来更好地处理处理并最终阻止,而.Net风格指南特别建议不要使用匈牙利符号疣's'或'cls'。
我冒昧地重构你的代码以利用它,所以我们将从这里开始。在我进一步发展之前,我想确保这个重构没有引入新的错误:
更新了我的帖子以显示所有重构代码。注意一些简单的名称更改,以及分解连接字符串和更改OpenWiSysConn()函数的工作方式。
Public Class PartsDepot
Public Function ProcessPartDepotOrders() As Boolean
Dim errMsg As String = ""
Try
Console.WriteLine(Now)
''//sendBadPOLineEmailtoDepot("test")
Dim POData As New 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.
POData = GetPoDataset(dbName, dbServer)
If POData Is Nothing Then
''// do you really want to quit here, or do you want to move to the next key?
''// Your error handling is.. inconsistent
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
''//use control/break style processing loop
Dim dt As DataTable = POData.Tables(0) ''// save some typing later
Dim dr As DataRow = dt.Rows(0)
Dim j As Integer = 0 ''// 'i' is already in use
While j < dt.Rows.Count ''//for each unprocessed, printed PO in the current company
''//Do setup work for next Order Number
Console.WriteLine("Processing PO#: " & dr("ord_no") & " in " & dbName)
Using wsConn As Wisys.Allsystem.ConnectionInfo = OpenWiSysConn(partDepotDbName, partDepotDbServer, True), _
wsPartDepotSalesOrd As 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
poNum = dr("ord_no")
''//Process individual lines within one order
While j < dt.Rows.Count AndAlso 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
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 AndAlso qtyOrd <> 0 Then
CreateLine(wsPartDepotSalesOrd, itemNum, qtyOrd, 0, requestDate, requestDate, promiseDate, itemPrice)
''//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
End If
j += 1
dr = dt.Rows(j)
End While
''//Do cleanup work from this order
wsConn.CloseWisysConnection(TrxEnums.TransactionAction.Commit, errMsg)
End Using ''// "End Using" will dispose of wsConn and wsPartDepotSalesOrd
End While
poNum = ""
i += 1
Next KeyName
Console.WriteLine("DONE")
Catch ex As Exception
Console.WriteLine("Exception processing part depot: " & ex.Message)
End Try ''// No need for finally section: Using statement ensures the objects were disposed
End Function
Private Function GetCustomer(ByVal CustomerNum As String, ByVal db As String, ByVal server As String) As DataTable
Dim ds As New DataSet
Using cn As New SqlClient.SqlConnection(GetConnectionString(db, server)), _
cmd As New SqlCommand("select cmp_name,cmp_fadd1,coalesce(debnr,crdnr) as CusNum from dbo.cicmpy where ltrim(debnr) = @cusnum or ltrim(crdnr) = @cusnum", cn), _
da As New SqlClient.SqlDataAdapter(cmd)
cmd.Parameters.Add(New SqlClient.SqlParameter("@cusnum", CustomerNum))
da.Fill(ds) ''// .Fill() will open the connection if needed
End Using ''// Using statement guarantees cn, cmd, and da are disposed
If ds.Tables.Count > 0 Then
Return ds.Tables(0)
End If
Return Nothing
End Function
Private Function GetPoDataset(ByVal db As String, ByVal server As String) As DataSet
Static Dim SQL As String = ConfigurationManager.AppSettings("getPoforPartsDepotSQL")
Dim ds As New DataSet
Using cn As New SqlClient.SqlConnection(GetConnectionString(db, server)), _
cmd As New SqlCommand(SQL, cn), _
da As New SqlClient.SqlDataAdapter(cmd)
da.Fill(ds)
End Using
Return ds
End Function
Private Function GetConnectionString(ByVal db As String, ByVal server As String)
Return String.Format("Persist Security Info=False;Integrated Security=true;Initial Catalog={0};server={1}", db, server)
End Function
Private Function OpenWiSysConn(ByVal dbName As String, ByVal dbServer As String, ByVal useTran As Boolean) As Wisys.Allsystem.ConnectionInfo
Dim ci As New Wisys.Allsystem.ConnectionInfo()
ci.Parameters(dbServer, dbName, "MacMSS")
Dim errMsg As String = String.Empty
If ci.OpenWisysConnection(useTran, errMsg) <> 0 Then
Console.WriteLine("Error processing part depot: " & errMsg)
Return Nothing
End If
Return ci
End Function
Private Function CreateLine(ByVal OEObj 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 RtnErrMsg As String = ""
Dim RtnVal As Long
Dim RtnLineNumber As Long
With OEObj
''//p_lRtnVal = .OrderHeader.Read(TrxEnums.OeOrderTypeEnum.Order, RtnOrder, True, True, True, RtnRecFound, RtnErrMsg)
OeLine = .OrderHeader.OrderLines.Add(TrxEnums.OrderLineType.InventoryItem, partNum.ToUpper, "", qtyOrdered, qtyToShip, price, price, RequestDate, PromiseDate, RequestShipDate, True, RtnErrMsg)
RtnVal = OeLine.Insert(RtnLineNumber, RtnErrMsg)
If RtnVal = 0 Then Return True
Console.WriteLine("Error creating sales order line# " & RtnLineNumber & ": " & RtnErrMsg)
sendBadPOLineEmailtoDepot("Error creating sales order line for PO# " & PONum & " because of an error: " & RtnErrMsg)
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
Static Dim SQL As String = ConfigurationManager.AppSettings("markPoLineAsSendToDepotSQL")
Using cn As New SqlClient.SqlConnection(GetConnectionString(DB, server)), _
cmd As New SqlClient.SqlCommand(SQL, cn)
cmd.Parameters.Add(New SqlClient.SqlParameter("@poOrdNum", poOrdNum))
cmd.Parameters.Add(New SqlClient.SqlParameter("@poLineNum", poLineNum))
cn.Open()
cmd.ExecuteNonQuery()
End Using
Return True
End Function
Private Function sendBadPOLineEmailtoDepot(ByVal msgText As String) As Boolean
Try
If ConfigurationManager.AppSettings("EnableSentBadPOMail").ToLower <> "true" Then Return True
Dim MailServer As String = ConfigurationManager.AppSettings("MailServer")
Dim ToAddress As String = ConfigurationManager.AppSettings("BadPOMailTo")
Dim FromAddress As String = ConfigurationManager.AppSettings("BadPOMailFrom")
Dim mySmtpClient As New System.Net.Mail.SmtpClient(MailServer)
mySmtpClient.UseDefaultCredentials = True
mySmtpClient.DeliveryMethod = Net.Mail.SmtpDeliveryMethod.Network
mySmtpClient.Send(FromAddress, ToAddress, 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
至于你的具体错误:看起来你有时会通过缓冲区写入,有时会绕过缓冲区。或者,如果文件中的每个“记录”段(记录以日期开头并以“完成”结束)是应用程序的单独实例的结果,您可能也会看到几个实例写入的结果同时到文件。这也是有道理的,因为流量是服务器和测试环境之间的一个巨大潜在差异。
答案 1 :(得分:1)
你确定这是在一个线程上运行吗?它几乎看起来像是一次运行几次迭代并写入同一个管道(stdout / console.wl)。 尝试将日志写入文件,在appkeyqry中为每次迭代创建不同的日志(如'log- {date} .txt')。 也许您的服务器是多核的,并且您有竞争条件?
编辑: 在每个Console.Write(Console.Out.Flush)之后尝试刷新标准输出 这可能是您的输出无序的原因。 (我写了很多perl脚本,并且在快速服务器上除非你在每次写入后将stdout设置为总是刷新,否则输出会像你的一样混淆)。
HTH,真的;)