Как отправить одно уведомление с многократным вводом претензий
Я создал программу, которая будет отправлять уведомления по электронной почте пользователю, которому будут зачислены требования о возмещении убытков. Теперь я заметил, что если у пользователя есть несколько возмещений, он будет отправлять их отдельно. Пример: 3 требования о возмещении расходов = 3 электронных письма.
Как я могу сделать, чтобы эти 3 возмещения были в одном уведомлении по электронной почте. Является ли моя петля Do WHile проблемой? Заранее спасибо
Что я уже пробовал:
Private Sub GetPayee() On Error GoTo errhandler txtmsg.Text = "Loading Records, Please wait..." txtmsg.Refresh() cn = New System.Data.OleDb.OleDbConnection cn.ConnectionString = cnStr cn.Open() Dim sSQL As String sSQL = "begin dbms_application_info.set_client_info(86); end;" Dim aCmd As New OleDb.OleDbCommand(sSQL, cn) aCmd.CommandType = CommandType.Text aCmd.ExecuteNonQuery() Dim sqlcmd As New OleDb.OleDbCommand("SELECT aca.vendor_id, aca.vendor_name, pvs.phone,aca.CHECK_STOCK_ID, pvs.email_address, aia.invoice_num, aip.amount, aip.accounting_date,aip.invoice_id, aip.check_id, aia.Description FROM ap_checks_all aca, ap_invoice_payments_all aip,ap_invoices_all aia, ap.ap_supplier_sites_all pvs, ap.AP_CHECK_STOCKS_ALL acs Where aca.check_id = aip.check_id And pvs.vendor_site_id = aca.vendor_site_id AND aip.invoice_id = aia.invoice_id AND aca.org_id = 86 AND aca.bank_account_name = 'BPI 0011117635' AND aca.REMIT_TO_SUPPLIER_SITE = 'OFFICE' and acs.CHECK_STOCK_ID= aca.PAYMENT_DOCUMENT_ID(+) " & _"AND UPPER (acs.name) = 'DEBIT ADVICE' AND aca.check_date = '" & Format(dtDate.Value, "yyyy-MMM-dd") & "' order by aca.vendor_id", cn) Dim myreader As OleDb.OleDbDataReader myreader = sqlcmd.ExecuteReader(CommandBehavior.CloseConnection) myreader.Read() Dim i As Integer = 0 Dim myArray As New ArrayList If myreader.Read <> False Then With ProgressBar .Value = 0 End With myArray.Add(myreader.Item("vendor_name")) Do While myreader.Read <> False Dim vDetail As String Dim vID As String Dim vDesc As String Dim vName As String = myreader.Item("vendor_name").ToString Dim vEmail As String = myreader.Item("email_address").ToString Dim vInvoice As String = myreader.Item("invoice_num").ToString Dim vAmount As String = myreader.Item("amount").ToString Dim x As Integer, y As Boolean txtmsg.Text = "Processing: " & myreader.Item("vendor_name").ToString & "'s Payroll..." txtmsg.Refresh() vDetail = "" vID = "" vID = myreader.Item("vendor_id").ToString retry: vDetail = vDetail & vbCrLf vDetail = vDetail & " Account Name: " & vName vDetail = vDetail & " Invoice No.: " & vInvoice & Space(20 -Len(vInvoice)) vDetail = vDetail & " Amount: " & Format(vAmount, "Standard") vDetail = vDetail & vbCrLf vDesc = myreader.Item("Description").ToString y = False For x = 1 To Len(vDesc) If x Mod 70 = 0 Then y = True End If If Mid(vDesc, x, 1) = " " And y Then y = False If x < Len(vDesc) Then vDesc = Mid(vDesc, 1, x - 1) & vbCrLf & Space(13) & Mid(vDesc, x + 1) End If End If Next vDetail = vDetail & Space(13) & vDesc 'Move Next i = i + 1 If myreader.Read <> False Then If "venodr_id" = vID Then GoTo retry End If End If 'Move To Previous i = i - 1 With ProgressBar .Value = 100 .Refresh() End With If vEmail <> "" Then SendMail(vEmail, vName, vDetail) 'Move Next i = i + 1 irec = myArray.Add(myreader.Item("vendor_name")) - 1 Loop End If myreader.Close() cn.Close() dtl = "Run Date: " & Now() & vbCrLf & _ "Mail Notification successful." & vbCrLf & _ irec & " records processed." & vbCrLf MsgBox(dtl) txtmsg.Text = "" ProgressBar.Value = 0 txtmsg.Refresh() Exit Sub errhandler: dtl = "Email Info:" & vbCrLf & _ "Run Date: " & Now() & vbCrLf & _ "Error: " & Err.Description & vbCrLf Me.Dispose() End Sub
Richard Deeming
On Error GoTo errhandler
Это древняя обработка ошибок в стиле VB6, которой следует избегать любой ценой. Вместо этого вы должны использовать правильную обработку исключений:
Попробуй...Поймать...Оператор Finally (Visual Basic) | Microsoft Docs[^]
"SELECT ... aca.check_date = '" & Format(dtDate.Value, "yyyy-MMM-dd") & "' ..."
Не делай этого так! В то время как в этом конкретном сценарии вы, вероятно, в безопасности, так как конкатенация строк рискует ввести SQL-инъекция[^] уязвимость. НИКОГДА используйте конкатенацию строк для построения SQL-запроса. ВСЕГДА используйте параметризованный запрос.
Все, что вы хотели знать о SQL-инъекции (но боялись спросить) | Трой Хант[^]
Как я могу объяснить SQL-инъекцию без технического жаргона? | Обмен Стеками Информационной Безопасности[^]
Шпаргалка по параметризации запросов | OWASP[^]
myreader.Read() ... If myreader.Read <> False Then ... Do While myreader.Read <> False
Каждый звонок к
Read
переходим к следующему рекорду. Вы всегда пропускаете первые две записи, возвращенные из вашего запроса.
BlackWidowScarlet
Я уже обновил свои коды, как вы советуете. Итак, как я могу отправить одно электронное письмо с несколькими возмещениями?
Richard Deeming
Начните с редактирования вашего вопроса, чтобы показать обновленный код.
[no name]
Просто чтобы подтвердить ужасные обстоятельства SQL-инъекции могут поставить вас в юмористическом стиле, что подразумевает;
Dim injectable As String = "b" Dim query As String = "SELECT * FROM table WHERE a = '" + injectable + "'" ' no problem
Dim injectable As String = "0; DROP TABLE everything" Dim query As String = "SELECT * FROM table WHERE a = '" + injectable + "'" ' rest in peace