#mysql #vb.net #visual-studio #visual-studio-2010 #forms
#mysql #vb.net #visual-studio #visual-studio-2010 #формы
Вопрос:
Я новичок в программировании на VB и столкнулся с проблемой: (после пары дней попыток решить это, нужна помощь!
Я пытаюсь передать некоторую информацию из формы VB в мою базу данных MySQL. я назвал все текстовые поля такими же, как поле в базе данных, и проверил все мои поля базы данных и имена текстовых полей, которые все правильные.
Когда я пытаюсь ввести информацию в форму, я иногда получаю ошибку в разделе .ExecuteNonQuery кода.
Для тестирования я вывел строку SQLStatement в текстовое поле (которое правильно отображало все поля из текстовых полей), затем вручную ввел завершенный SQL-запрос в базу данных, и это сработало. Но когда я пытаюсь сделать это за один раз, кажется, что это не удается, если текста слишком много (если я ввожу ‘a’ в каждое поле, это работает). Ограничены ли они размером SQL-запроса, который может быть передан из VB?? все поля базы данных MySQL имеют текстовое значение без ограничений по размеру.
Заранее спасибо!!!
Public Sub SaveQuote(ByRef SQLStatement As String)
Dim cmd As MySqlCommand = New MySqlCommand
With cmd
.CommandText = SQLStatement
.CommandType = CommandType.Text
.Connection = SQLConnection
.ExecuteNonQuery()
End With
SQLConnection.Close()
MsgBox("successfully Added!")
SQLConnection.Dispose()
End Sub
Private Sub CmdSave_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CmdSave.Click
Dim SQLstatement As String = "INSERT INTO laptopstock(forename,surname,emailaddress,contactnumber,quotedate,manufacturer,model,os,battery,drive,defects) VALUES('" amp; forename.Text amp; "','" amp; surname.Text amp; "','" amp; emailaddress.Text amp; "','" amp; contactnumber.Text amp; "', CURDATE(),'" amp; manufacturer.Text amp; "','" amp; modelnumber.Text amp; "','" amp; os.Text amp; "','" amp; batterycondition.Text amp; "','" amp; drivetype.Text amp; "','" amp; defects.Text amp; "')"
SaveQuote(SQLstatement)
End Sub
‘Тестовый SQL-запрос
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim testSQLstatement As String = "INSERT INTO laptopstock(forename,surname,emailaddress,contactnumber,quotedate,manufacturer,model,os,battery,drive,defects) VALUES('" amp; forename.Text amp; "','" amp; surname.Text amp; "','" amp; emailaddress.Text amp; "','" amp; contactnumber.Text amp; "', CURDATE(),'" amp; manufacturer.Text amp; "','" amp; modelnumber.Text amp; "','" amp; os.Text amp; "','" amp; batterycondition.Text amp; "','" amp; drivetype.Text amp; "','" amp; defects.Text amp; "')"
testbox.Text = testSQLstatement
End Sub
вот вывод из testSQLstatement = testbox.text
INSERT INTO laptopstock(forename,surname,emailaddress,contactnumber,quotedate,manufacturer,model,os,battery,drive,defects) VALUES('Joe','Bloggs','J.bloggs@jbloggs.com','07777777777', CURDATE(),'Sony','Vaio','Windows 7 Pro','Poor','DVD-Rom','Faulty Screen')
из того, что я вижу, оно правильно отформатировано, и когда я ввожу это непосредственно в запрос на сервере MySQL, создается запись
Комментарии:
1. Не используйте конкатенацию строк подобным образом для построения ваших запросов. Это делает вас уязвимым для атак с использованием sql-инъекций.
Ответ №1:
Имеет ли ваше приложение SQL login права на вставку в эту таблицу? Попробуйте напрямую выполнить статус предоставления в консоли SQL: «предоставьте вставку в dbo.laptopstock для (добавьте сюда свой логин для приложения)» Кроме того, я почему вы передаете SQLStatement по ссылке? Вы не изменяете его, поэтому используйте byval. Это не должно повлиять на код, но является хорошей практикой.
Я вижу, вы заявляете, что иногда вы получаете ошибку, поэтому мы можем предположить, что это рабочий код. Это наводит меня на мысль, что это в ваших входных данных. Принимают ли поля значения null? Они в правильном формате? Кроме того, одна из этих вещей не похожа на другие, дата. Вы передаете функцию curdate() во вставке. Если все поля представляют собой строки, как вы упомянули, то вы выполняете неявное преобразование из даты в строку. Вы могли бы так же легко создать строку insert, используя Vb.Net эквивалент. (Date.Now.toString).
Наконец, это трудно отладить без более подробной информации об ошибке. Поскольку вы не опубликовали код для своих объектов SqlConnection и MySLCommand (конечно, вы не имеете в виду MySqlCommand как новую SqlCommand) Я должен предположить, что они работают.