BlackWidowScarlet Ответов: 1

Считыватель пропускает записи


Я создал программу, которая будет отправлять уведомления по электронной почте пользователю, которому будут зачислены требования о возмещении убытков. Теперь я заметил, что моя отправка электронной почты не равна загрузке данных.

Я думаю, что читатель пропускает записи. Как сделать так, чтобы читатель не пропускал записи. Заранее спасибо

Что я уже пробовал:

 Dim myreader As OleDb.OleDbDataReader
            myreader = sqlcmd.ExecuteReader()

            myreader.Read()
            Dim i As Integer = 0
            Dim myArray As New ArrayList

            myArray.Add(myreader.Item("vendor_name"))

       Do While myreader.Read <> False

            Dim x As Integer, y As Boolean
            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


            txtmsg.Text = "Processing: " & vName & "'s Payroll..."
            txtmsg.Refresh()
            vDetail = ""
            vID = ""
            vID = myreader.Item("vendor_id").ToString
            irec = myArray.Add(myreader.Item("vendor_name"))
retry:
            vDetail = vDetail & vbCrLf
            vDetail = vDetail & "Invoice No.: " & myreader.Item("invoice_num").ToString
            vDetail = vDetail & " Amount: " & Format(myreader.Item("amount").ToString, "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 & Mid(vDesc, x + 1)
                    End If
                End If
            Next
            vDetail = vDetail & vDesc
            i = i + 1

            If myreader.Read <> False Then
                If myreader.Item("vendor_id") = vID Then
                    GoTo retry
                End If
            End If
            i = i - 1
            With ProgressBar
                .Value = 100
                .Refresh()
            End With

            If vEmail <> "" Then SendMail(vEmail, vName, vDetail)
            'Move To Next
            i = i + 1

            Loop
            End If

1 Ответов

Рейтинг:
12

Dave Kreskowiak

Читатель не пропускает записи. Запуск кода в отладчике сказал бы вам об этом.
Шансы гораздо выше, чем у вашего экстра .Читать призывы, являющиеся причиной проблемы. У тебя должен быть только один .Прочитайте вызов в вашем цикле, но у вас есть больше, чем один, особенно в этом ifзаявление.

Вы догадываетесь, что делает ваш код, то есть "пропускаете записи". Это огромный признак того, что вы должны запускать это под отладчиком, чтобы вы могли точно следить за тем, что делает код, и исследовать содержимое переменных.

Кроме того, если вы используете оператор Goto, вам действительно нужно изучить логику, которую вы используете.

Познакомьтесь с отладчиком. Он предназначен для отладки вас и вашего понимания кода.


BlackWidowScarlet

Я запускаю программу под отладчиком и узнаю, что моя ошибка используется .read дважды я обновил свой код с помощью этого, но получил ошибку на goTO

If myreader.HasRows() Then
                With ProgressBar.Value = 0
                End With
            End If

            Do While myreader.Read()

                myArray.Add(myreader.Item("vendor_name"))

                Dim x As Integer, y As Boolean
                Dim vDetail As String
                Dim vID As String
                Dim vDesc As String
                Dim vName As String = myreader.Item("vendor_name").ToString
                'Dim vID1 As String = myreader.Item("vendor_id").ToString
                Dim vEmail As String = myreader.Item("email_address").ToString

                txtmsg.Text = "Processing: " & vName & "'s Payroll..."
                txtmsg.Refresh()
                vDetail = ""
                vID = ""
                vID = myreader.Item("vendor_id").ToString
                irec = myArray.Add(myreader.Item("vendor_name"))
retry:
                vDetail = vDetail & vbCrLf
                vDetail = vDetail & "Invoice No.: " & myreader.Item("invoice_num").ToString
                vDetail = vDetail & " Amount: " & Format(myreader.Item("amount").ToString, "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 & Mid(vDesc, x + 1)
                        End If
                    End If
                Next
                vDetail = vDetail & vDesc
                i = i + 1

                    If myreader.Item("vendor_id").ToString = vID Then
                        GoTo retry
                    End If

                i = i - 1

                With ProgressBar
                    .Value = 100
                    .Refresh()
                End With

                If vEmail <> "" Then SendMail(vEmail, vName, vDetail)

                i = i + 1

            Loop


            myreader.Close()

Dave Kreskowiak

Я понятия не имею, какую ошибку вы можете получить на Goto.

У вас также нет никаких причин для его использования. Я не использовал Goto в течение последних 30 или около того лет написания кода.