我正在尝试使用VB将数据插入MySQL。
当我使用这些文本框插入数据时,数据会被添加,但我不想将文本输入到文本框中,而是直接按下按钮(更新)直接添加基础信息。它给出了一个语法错误来检查MySQL版本。这是一个查询错误?我不知道该怎么做。请帮忙。这是我的代码。
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Mysqlconn = New MySqlConnection
Mysqlconn.ConnectionString = "server=localhost;userid=root;port=85;password=*****;database=data"
Dim reader As MySqlDataReader
Try
Mysqlconn.Open()
Dim query As String
query = "INSERT INTO 'data'.'etable'('eid','Name','Surname','Age')values('7','Andy','Roddick','35')"
command = New MySqlCommand(query, Mysqlconn)
reader = command.ExecuteReader
MessageBox.Show("Data Saved")
Mysqlconn.Close()
Catch ex As MySqlException
MessageBox.Show(ex.Message)
Mysqlconn.Dispose()
End Try
End Sub
End Class
答案 0 :(得分:1)
包含表名和字段名的正确字符是反引号而不是单引号。使用数字小键盘上的ALT + 096将其插入。
query = "INSERT INTO `data`.`etable`(`eid`,`Name`,`Surname`,`Age`) " & _
"values('7','Andy','Roddick','35')"
说,检查数据库表是否有字段eid和Age of type varchar
。如果字段是数字(如名称似乎暗示),那么您的查询应更改为
query = "INSERT INTO `data`.`etable`(`eid`,`Name`,`Surname`,`Age`) " & _
"values(7,'Andy','Roddick',35)"
您的代码还包含一些需要删除的不良做法,以避免将来出现问题
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim query As String
query = "INSERT INTO `data`.`etable`(`eid`,`Name`,`Surname`,`Age`) " & _
"values(7,'Andy','Roddick',35)"
Using Mysqlconn = New MySqlConnection
Using command = New MySqlCommand(query, Mysqlconn)
Mysqlconn.ConnectionString = "server=localhost;userid=root;port=85;password=*****;database=data"
Try
Mysqlconn.Open()
Dim rowsAffected = command.ExecuteNonQuery()
if rowsAffected > 0 Then
MessageBox.Show("Data Saved")
End If
Catch ex As MySqlException
MessageBox.Show(ex.Message)
End Try
End Using
End Using
End Sub
首先将所有一次性对象包含在Using语句中,以确保它们在异常的情况下被关闭和处理,然后不要使用ExecuteReader进行INSERT,UPDATE和DELETE查询,而是使用正确的方法是ExecuteNonQuery
答案 1 :(得分:1)
试试这个,它也解决了一些其他问题和潜在问题:
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
Dim query As String = "INSERT INTO `data`.`etable`(eid,Name,Surname,Age)" & _
" VALUES (@eid, @Name, @Surname, @Age)"
Using con As New MySqlConnection("server=localhost;userid=DONT_USE_ROOT!;port=85;password=*****;database=data"), _
cmd As New MySqlCommand(query, con)
'Guessing at parameter types/lengths here.
cmd.Parameters.Add("@eid", MySqlDbType.Int32).Value = 7
cmd.Parameters.Add("@Name", MySqlDbType.VarChar, 20).Value = "Andy"
cmd.Parameters.Add("@Surname", MySqlDbType.VarChar, 25).Value = "Roddick"
cmd.Parameters.Add("@Age", MySqlDbType.Int32).Value = 35
conn.Open()
If cmd.ExecuteNonQuery() > 0 Then MessageBox.Show("Data Saved")
End Using
End Sub
注意我也删除了异常处理程序。现在不再需要旧处理程序中的Dispose()
调用(Using
块处理此问题),并且我倾向于提倡处理异常处理异常而不是抛出异常...在这种情况下,您已经处于按钮事件中。我真正推荐的是将数据库代码移动到它自己的类中,因此这将在该类中的单独方法中。然后你仍然可以在按钮点击事件中找到你的异常处理程序,Try
块中唯一的东西就是调用该方法。
为了防止sql注入攻击,养成使用查询参数进入sql查询的数据的习惯也非常重要。你所拥有的东西还不容易受到攻击,但它并没有让人相信它很快就不会受到攻击。