BlackWidowScarlet Ответов: 0

Как отправить одно уведомление с многократным вводом претензий


Я создал программу, которая будет отправлять уведомления по электронной почте пользователю, которому будут зачислены требования о возмещении убытков. Теперь я заметил, что если у пользователя есть несколько возмещений, он будет отправлять их отдельно. Пример: 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

0 Ответов