更新。帮帮我,我做错了吗?

update. Help me, am I doing it wrong?

这里是一个代码,用于更新与学生输入的学生 ID 相对应的费用列中的数据。代码没有错误,但程序似乎没有更新数据库中的值。

  Private Sub dbupdate()
        'Create a connection object.
        myConnectionString = "server=localhost;" _
              & "uid=root;" _
              & "pwd=password;" _
              & "database=dummystudents"

        Try
            'open the connection
            Dim conn As New MySql.Data.MySqlClient.MySqlConnection(myConnectionString)
            conn.Open()

            'create a command object.
            sql = "UPDATE students SET fees = '" & txtBalance.Text & "'WHERE idstudents = '" & txtStudentID.Text
            command = New MySqlCommand(sql, conn)
            command.ExecuteNonQuery()
            'Close connection
            conn.Close()

        Catch ex As Exception

        End Try


    End Sub

您在使用调试器吗?我的意思是 真的使用 调试器?在构建 sql 并检查实际的 sql 之后放置一个断点。它看起来正确吗?

UPDATE students SET fees = 'txtBalanceText'WHERE idstudents = 'txtStudentIDText

您可能会注意到它在学生 ID 后缺少一个结束单引号。另外,我想知道您的数据库中的 feesidstudents 是什么类型。如果它们是数字,它们应该是,那么您根本不使用单引号。如果它们是文本,那么您确实需要引号。修复引号。您可以像这样添加另一个单引号

sql = "UPDATE students SET fees = '" & txtBalance.Text & "' WHERE idstudents = '" & txtStudentID.Text & "'"

以上代码只会修复缺少的引号。

但是,you should parameterize your queries,并不仅仅是直接使用文本框。您的代码容易出现 sql 注入,您应该认真对待。从本质上讲,这段代码很容易受到将自己的子查询放入文本框的人的攻击,就像这样

以下是改进代码的方法。其一,使用 Using 块来创建和处理连接和命令。这些对象可能在幕后有非托管内存,您应该始终调用 obj.Dispose() 或让 Using 块自动处理它。此外,此示例添加了您的参数,有效避免了上述 sql 注入风险

Dim myConnectionString = "server=localhost;" &
    "uid=root;" &
    "pwd=password;" &
    "database=dummystudents"
Using conn As New MySqlConnection(myConnectionString)
    conn.Open()
    Dim sql = "UPDATE students SET fees = @fees WHERE idstudents = @studentID"
    Using com As New MySqlCommand(sql, conn)
        com.Parameters.AddWithValue("@fees", txtBalance.Text)
        com.Parameters.AddWithValue("@studentID", txtStudentID.Text)
        com.ExecuteNonQuery()
    End Using
End Using

根据字段类型,添加参数将包含或排除单引号,因此您无需再担心 - 一个额外的好处。