-1

在 mysql 工作台中,我可以输入

UPDATE contact_log
SET note = 'test1'
WHERE customer = 'customer'

它将更新客户的注释。当我在 asp.net 中尝试这个时,它没有效果。

    Try
        conn.Open()
        cmd.Connection = conn
    Catch ex As Exception

    End Try
    cmd.CommandText = "UPDATE contact_log " +
                "SET note = '" & TextBox2.Text & "'" +
                "WHERE customer = '" & Request.QueryString("ID") & "'"
    reader = cmd.ExecuteReader()
    conn.Close()
    conn.Dispose()

一些事实是连接字符串是正确的,我可以毫无问题地使用 select 并带回数据,并且 request.querystring("ID") 带回客户名称。

有没有更好的方法来从 asp.net 更新 mysql 表,或者一种实际有效的方法?

4

2 回答 2

4

您的代码中存在许多问题。

  • 不使用字符串连接构建sql命令,而是参数化查询
  • 不要捕获异常并吞下它们
  • 使用适当的 using 语句来关闭和释放连接
  • 当然 INSERT/UPDATE/DELETE 语句需要 ExecuteNonQuery

总而言之,我会将您的代码更改为此

Dim cmdText = "UPDATE contact_log SET note = @note WHERE customer = @cust"
Using conn = new MySqlConnection(connString)
Using cmd = new MySqlCommand(cmdText, conn)
    conn.Open()
    cmd.Parameters.AddWithValue("@note",TextBox2.Text)
    cmd.Parameters.AddWithValue("@cust",Request.QueryString("ID"))
    Dim rowsAffected = cmd.ExecuteNonQuery()
End Using
End Using

参数化查询非常重要,因为您可以避免Sql 注入和解析包含引号的字符串的问题(如果 TextBox2 包含带单引号的文本,则会出现语法错误)

Using 语句将确保您的连接在异常情况下正确关闭和处理,避免危险的内存泄漏并降低系统资源的使用率

在代码的上层可以更好地处理异常,您可以在其中向用户显示消息或写入错误日志。捕获异常并且什么都不做是非常糟糕的,因为您永远不会知道代码失败的原因是什么。

于 2013-07-15T19:35:27.587 回答
1

您使用了错误的命令...您正在写入数据库,而不是从中读取-您需要从使用阅读器更改为执行命令...。

尝试这个:

cmd.CommandText = "UPDATE contact_log " +
            "SET note = '" & TextBox2.Text & "'" +
            "WHERE customer = '" & Request.QueryString("ID") & "'"
cmd.ExecuteNonQuery()
conn.Close()
conn.Dispose()
于 2013-07-15T19:27:58.257 回答