Одна из приятных особенностей List (Of T) заключается в том, что вам не нужно знать размер, прежде чем добавлять элементы. Он будет расширяться по мере необходимости. Итак, я удалил int32 из конструктора.
Я думаю, что вы хотите dt_data.RowCount -2
в For
цикле, иначе вы пропустите последнюю строку. Я изменил ваш .AddWithValue
на .Add
. Вам нужно будет проверить правильность типов данных в вашей базе данных (я догадался) и соответствующим образом скорректировать код.
Я думаю, что ваша основная проблема была в String.Format
. Вы добавили 2 параметра, но не добавили {1}
.
Я добавил Debug.Print
, чтобы вы могли проверить, выглядит ли ваш выбор как вы ожидаете. Это появится в ближайшем окне при запуске в режиме отладки. Это не повлияет на версию релиза.
Вам не нужны DataAdapter
или DataSet
, просто DataTable
. Назначьте .DataSource
за пределами блока Using
.
Я не думаю, что есть какая-либо проблема с внедрением sql, потому что вы правильно использовали параметры для всех переменных.
Private Sub OPCode(cycle2last As String)
Dim dt As New DataTable
Using conn As New SqlConnection("Your connection string")
Using command As New SqlCommand()
command.Connection = conn
Dim parameterNames As New List(Of String)
For i As Integer = 0 To DataGridView1.RowCount - 2
Dim parameterName As String = "@meter_num_" & i
Dim meter_number As String = DataGridView1.Rows(i).Cells(3).Value.ToString
command.Parameters.Add(parameterName, SqlDbType.VarChar).Value = meter_number
parameterNames.Add(parameterName)
Next
command.CommandText = String.Format("SELECT * FROM customer WHERE cycle = @cycle and meter_num IN ({0}) {1}", String.Join(",", parameterNames), ("ORDER BY Client_Name ASC;"))
command.Parameters.Add("@cycle", SqlDbType.VarChar).Value = cycle2last
Debug.Print(command.CommandText)
conn.Open()
dt.Load(command.ExecuteReader)
End Using
End Using
DataGridView2.DataSource = dt
End Sub