Member 14153541 Ответов: 2

Vb.net как выполнить цикл запроса и отображения его результатов в 1 практическое руководство


У меня есть лист Excel,загруженный в dt_data, и я хочу сравнить значения dt_data
в мою базу данных и отобразить ее на другом datagridview который является dt_sample
, внутри моей базы данных есть запись за последние 3 месяца, и я хочу, чтобы они все были отображены вот мой код ниже

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

Try
            For i As Integer = 0 To dt_data.RowCount - 3
                Dim meter_number As String
                meter_number = dt_data.Rows(i).Cells(3).Value
                Dim query As String = "Select * from customer where meter_num = @meter_num"
                conn.Open()
                Dim command As New SqlCommand(query, conn)
                command.Parameters.AddWithValue("@meter_num", meter_number)
                Dim da As New SqlDataAdapter(command)
                Dim ds As New DataSet
                da.Fill(ds, "customer")
                dt_sample.DataSource = ds.Tables(0)


                conn.Close()

            Next
        Catch ex As SqlException
            MsgBox(ex.Message, MsgBoxStyle.Critical, "SQL Error")
        Catch ex As Exception
            MsgBox(ex.Message, MsgBoxStyle.Critical, "General Error")
            'End Try
            'Catch ex As Exception
            'MessageBox.Show(String.Format("Error: {0}", ex.Message), "Error", MessageBoxButtons.OKCancel, MessageBoxIcon.Error)
        End Try


выход для этого будет только последняя показываемая ячейка.

[^]]

2 Ответов

Рейтинг:
16

Richard Deeming

Попробуйте что-нибудь вроде этого:

Using command As New SqlCommand()
    command.Connection = conn
    
    Dim parameterNames As New List(Of String)(dt_data.RowCount - 2)
    For i As Integer = 0 To dt_data.RowCount - 3
        Dim parameterName As String = "@meter_num_" & i
        Dim meter_number As String = dt_data.Rows(i).Cells(3).Value
        command.Parameters.AddWithValue(parameterName, meter_number)
        parameterNames.Add(parameterName)
    Next
    
    command.CommandText = String.Format("SELECT * FROM customer WHERE meter_num IN ({0})", String.Join(",", parameterNames))
    
    Dim da As New SqlDataAdapter(command)
    Dim ds As New DataSet
    da.Fill(ds, "customer")
    dt_sample.DataSource = ds.Tables(0)
End Using


Member 14153541

Спасибо, что это работает как шарм, искал решение в течение месяца

Рейтинг:
1

RickZeeland

Не помещайте эти строки в свой цикл For:

Dim query As String = "Select * from customer where meter_num = @meter_num"
conn.Open()
Dim command As New SqlCommand(query, conn)
command.Parameters.AddWithValue("@meter_num", meter_number)
Dim da As New SqlDataAdapter(command)
Dim ds As New DataSet
da.Fill(ds, "customer")
dt_sample.DataSource = ds.Tables(0)
conn.Close()

И постройте свой запрос следующим образом:
Dim query As String = "Select * from customer where meter_num IN @meter_numbers"
[Edit] см. решение Ричарда Диминга или попробуйте один из методов, упомянутых здесь: sql server - параметризация предложения SQL IN - переполнение стека[^]


Richard Deeming

К сожалению, вы не можете использовать один параметр для IN запрос.

RickZeeland

Спасибо, что указали на это, я обновлю решение :)