mysql - 在 vb.net 中将 sql 数据添加到 DB 是否需要 .ExecuteNonQuery()

标签 mysql sql vb.net winforms visual-studio-2010

我正在运行以下代码(部分代码)来连接到 PHPmyadmin DB

Private Sub sreg_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

        SqlConnection.ConnectionString = ServerString



        Try
            If SqlConnection.State = ConnectionState.Closed Then
                SqlConnection.Open()
                MsgBox("Successfully connected to MySQL DB")
            Else
                SqlConnection.Close()
                MsgBox("Connection is Closed")
            End If
        Catch ex As Exception
            MsgBox(ex.ToString)

        End Try
    End Sub

Public Sub SaveNames(ByRef SQLStatment As String)
        Dim cmd As MySqlCommand = New MySqlCommand

        With cmd
            .CommandText = SQLStatment
            .CommandType = CommandType.Text
            .Connection = SqlConnection
            .ExecuteNonQuery()
        End With

        SqlConnection.Close()
        MsgBox("Succesfully Added!")
        SqlConnection.Dispose()
    End Sub 

然而,.ExecuteNonQuery() 在错误和问题方面让我非常头疼。它上传数据,但是之前只能执行一次(一次上传),它会返回错误。

当我删除 .ExecuteNonQuery() 时,没有上传数据?所以我觉得还是有必要的。

这是我上传的代码(部分)

 sql = "INSERT INTO students(student_id, title, initial, surname,
 street, city, pcode, country ) VALUES ('" & strStudent & "', '" 
 & vtital & "', '" & vinital & "', '" & vsurname & "', '" & vstreet 
 & "', '" & vcity & "', '" & vpcode & "', '" & vcountry & "' )"

 SaveNames(sql)

希望我的问题有意义并且我能传达信息

最佳答案

您保存此数据的方法存在一些错误,可能会导致您的问题。
第一个问题是代码不使用参数化查询。这是一个安全问题(Sql 注入(inject)),也是一个简单的逻辑问题。如果您连接字符串来构建 SQL 查询,那么您会遇到一个问题,即字符串中包含对数据库 SQL 引擎具有特殊含义的字符。如果您的字符串之一包含单引号怎么办?它将被视为字符串的结尾,而文本的其余部分则被视为无效 sql。

第二个问题是在出现异常时也缺少 MySqlConnection 的打开/关闭/处置。这是通过使用 Using Statement 解决的。

所以我会将你的方法重写为

Public SaveNames(ByRef SQLStatment As String, List(Of MySqlParameter) parameters) As Integer
    Using con = new MySqlConnection(... put here the connection string...)
    Using cmd = New MySqlCommand(SQLStatment, con)
         if parameters.Count > 0 Then
            cmd.Parameters.AddRange(parameters.ToArray())
         End If
         return cmd.ExecuteNonQuery()
    End Using
    End Using
End Function

并用这样的代码调用它

sql = "INSERT INTO students(student_id, title, initial, surname," & _
      "street, city, pcode, country ) VALUES (@id,@title,@init,@sur," & _
      "@street,@city,@pcode,@country)"
Dim ps = New List(Of MySqlParameters)()
Dim p = new MySqlParameter("@id", MySqlDbType.Int32).Value = Convert.ToInt32(strStudent)
ps.Add(p)
p = new MySqlParameter("@title", MySqlDbType.VarChar).Value = vtital
ps.Add(p)
.. and so on for the other parameters. 
.. respecting the actual datatype on the database table
.....
SaveNames(sql, ps)

关于mysql - 在 vb.net 中将 sql 数据添加到 DB 是否需要 .ExecuteNonQuery(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22192334/

相关文章:

mysql - 检查 mysql 不工作(没有错误)

mysql - 如何选择与其他列匹配的列更多的结果?

php - SQL 查询 - 比较值以显示可用性

mysql - 如何使magento搜索功能更快?

具有列号的 SQL 循环

sql - Informatica - 如何将查询从表传递到 SQL 转换并获取结果

sql - 何时提交更改?

vb.net - 如何在具有多个控件的列中设置 DataGridViewButtonCell 文本

c# - Visual Studio XML 外部注释文件不起作用

vb.net - 控制堆栈溢出的技术?