#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 и следовал его инструкциям, ваше объяснение мне очень помогает, потому что я все еще практикую.