Передача суммы запроса в label

#mysql #vb.net

#mysql #vb.net

Вопрос:

запрос работает в командной строке mysql, но как я могу поместить сумму в метку

введите описание изображения здесь

 Dim SDA As New MySqlDataAdapter
Dim bSource As New BindingSource
Dim dbDataSet As New DataTable
Try
    MysqlConn.Open()
    Dim Query As String

    Query = "select sum(No_Of_Case_To_Be_Deliver) from ordered= '" amp; totalcase.Text amp; "'"

    COMMAND = New MySqlCommand(Query, MysqlConn)
    SDA.SelectCommand = COMMAND
    SDA.Fill(dbDataSet)
    bSource.DataSource = dbDataSet
    MysqlConn.Close()


Catch ex As Exception
    MessageBox.Show(ex.Message)
Finally
    MysqlConn.Dispose()

End Try
  

Комментарии:

1. Ваш запрос недействителен . Вам не хватает FROM таблицы и WHERE перед ordered . Если ordered это имя вашей таблицы, то вам не хватает WHERE something = '...' .

2. Также попробуйте использовать параметры вместо текста текстового поля, чтобы избежать возможных sql-инъекций.

3. Я попытался поместить из таблицы и куда. нет сообщения об ошибке, но сумма не отображается в label

4. Не могли бы вы, пожалуйста, опубликовать свой фактический код? Имеющийся у вас код не будет компилироваться сам по себе, поэтому трудно понять, связана ли проблема с чем-то, чего мы не видим.

Ответ №1:

Никогда не объединяйте строки для построения инструкции Sql. Используйте параметры. Вы рискуете повредить свою базу данных.

DataAdapter откроет и закроет свое соединение для вас как часть .Fill метода. Однако, если он находит соединение открытым, он оставляет его открытым.

Рад видеть, что вам позвонили .Dispose по вашему соединению, но вы можете избавить себя от хлопот, используя `Using…Прекратить использование блоков. Это гарантирует, что объекты вашей базы данных будут закрыты и удалены, даже если произойдет ошибка.

Теперь перейдем к коду. Вы ничего не заполняете и не обновляете, поэтому вам не нужен DataAdapter для этого запроса. Вы ничего не привязываете, так что нет BindingSource . Плохое название для DataTable (dbDataSet), потому что DataSet это объект другого типа. Любой, кто пытается поддерживать ваш код, может быть легко сбит с толку.

Используя параметры, вы не только избавляете себя от SQL-инъекции, но и значительно упрощаете инструкцию Sql. Не беспокойтесь о двойных кавычках, одинарных кавычках и т.д.

Поскольку вы извлекаете только один фрагмент данных, вы можете использовать .ExecuteScalar который возвращает первый столбец первой строки результирующего набора.

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

 Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    lblTotalCases.Text = DirectCast(GetTotalCases(CInt(totalcase.Text)), String)
End Sub

Private Function GetTotalCases(OrderID As Integer) As Integer
    Dim TotalCases As Integer
    'I made up a query since your query didn't make sense.
    Dim Query = "select sum(No_Of_Case_To_Be_Deliver) from OrderDetails Where OrderID = @ID;"
    Using MysqlConn As New MySqlConnection("Your Connection String")
        Using Command As New MySqlCommand(Query, MysqlConn)
            Command.Parameters.Add("@ID", MySqlDbType.Int32).Value = OrderID
            MysqlConn.Open()
            TotalCases = CInt(Command.ExecuteScalar)
        End Using
    End Using
    Return TotalCases
End Function
  

Комментарии:

1. извините за название, я только что посмотрел учебник в yt и следовал его инструкциям, ваше объяснение мне очень помогает, потому что я все еще практикую.