Добавить предложение ORDER BY в VB.Net? - PullRequest
0 голосов
/ 28 октября 2019

Как объединить предложение

ORDER BY

в VB.NET?

Вот что я пробовал:

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 cycle = @cycle and meter_num IN ({0})", String.Join(",", parameterNames), ("ORDER BY Client_Name ASC"))
    command.Parameters.AddWithValue("@cycle", cycle2last)

    Dim da As New SqlDataAdapter(command)
    Dim ds As New DataSet
    da.Fill(ds, "customer")
    Compare_Reading.dt_last2month.DataSource = ds.Tables(0)
End Using

Я хотел, чтобы это было так

Select * from table_name 
where column_name = @column and column2 = @column2 
ORDER BY column_name ASC

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Одна из приятных особенностей 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
0 голосов
/ 28 октября 2019

Для этого в одной инструкции необходимо заменить

Compare_Reading.dt_last2month.DataSource = ds.Tables(0)

на:

Compare_Reading.dt_last2month.DataSource = (From existing As DataRow In ds.Tables(0).Select Order By existing.Item("your_filed_name_to_order_here") Ascending).CopyToDataTable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...