【问题标题】:Database not updating after UPDATE SQL statement in ASP.net在 ASP.net 中更新 SQL 语句后数据库未更新
【发布时间】:2011-01-28 20:39:08
【问题描述】:

我目前在尝试更新数据库中的记录时遇到问题。我有一个在文本框中显示用户详细信息的网页,这些详细信息是在登录时从会话中获取的。目的是在用户覆盖文本框中的当前文本时更新详细信息。

我有一个功能在用户单击“保存详细信息”按钮时运行,它似乎可以工作,因为我已经测试了受影响的行数并输出 1。但是,在检查数据库时,记录没有已更新,我不确定为什么。

我已经通过将其显示为标签来检查正在处理的 SQL 语句,它看起来是这样的:

UPDATE [users] 
   SET [email] = @email, 
       [firstname] = @firstname, 
       [lastname] = @lastname, 
       [promo] = @promo 
 WHERE [users].[user_id] = 16

函数及其他相关代码为:

Sub Page_Load(sender As Object, e As EventArgs)

usernameLabel.text = session.contents.item("UserName")

if usernameLabel.text = "" then

    logoutButton.Visible = False
    loggedInAsLabel.Visible = False

else

    labelGuest.Visible = False
    linkLogin.Visible = False
    linkRegister.Visible = False

end if

emailBox.text = session.contents.item("Email")
firstBox.text = session.contents.item("FirstName")
lastBox.text = session.contents.item("LastName")
promoBox.text = session.contents.item("Promo")


End Sub

Sub Button1_Click(sender As Object, e As EventArgs)

    changeDetails(emailBox.text, firstBox.text, lastBox.text, promoBox.text)

End Sub

Function changeDetails(ByVal email As String, ByVal firstname As String, ByVal lastname As String, ByVal promo As String) As Integer
    Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0; Ole DB Services=-4; Data Source=C:\Documents an"& _
        "d Settings\Paul Jarratt\My Documents\ticketoffice\datab\ticketoffice.mdb"
    Dim dbConnection As System.Data.IDbConnection = New System.Data.OleDb.OleDbConnection(connectionString)

    Dim queryString As String = "UPDATE [users] SET [email]=@email, [firstname]=@firstname, [lastname]=@lastname, "& _
        "[promo]=@promo WHERE ([users].[user_id] = " + session.contents.item("ID") + ")"
    Dim dbCommand As System.Data.IDbCommand = New System.Data.OleDb.OleDbCommand
    dbCommand.CommandText = queryString
    dbCommand.Connection = dbConnection

    Dim dbParam_email As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
    dbParam_email.ParameterName = "@email"
    dbParam_email.Value = email
    dbParam_email.DbType = System.Data.DbType.[String]
    dbCommand.Parameters.Add(dbParam_email)

    Dim dbParam_firstname As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
    dbParam_firstname.ParameterName = "@firstname"
    dbParam_firstname.Value = firstname
    dbParam_firstname.DbType = System.Data.DbType.[String]
    dbCommand.Parameters.Add(dbParam_firstname)

    Dim dbParam_lastname As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
    dbParam_lastname.ParameterName = "@lastname"
    dbParam_lastname.Value = lastname
    dbParam_lastname.DbType = System.Data.DbType.[String]
    dbCommand.Parameters.Add(dbParam_lastname)

    Dim dbParam_promo As System.Data.IDataParameter = New System.Data.OleDb.OleDbParameter
    dbParam_promo.ParameterName = "@promo"
    dbParam_promo.Value = promo
    dbParam_promo.DbType = System.Data.DbType.[String]
    dbCommand.Parameters.Add(dbParam_promo)

    Dim rowsAffected As Integer = 0
    dbConnection.Open
    Try
        rowsAffected = dbCommand.ExecuteNonQuery
    Finally
        dbConnection.Close
    End Try

    labelTest.text = rowsAffected.ToString()

    if rowsAffected = 1 then

    labelSuccess.text = "* Your details have been updated and saved"

    else

    labelError.text = "* Your details could not be updated"

    end if

End Function

任何帮助将不胜感激。

【问题讨论】:

  • 您是否检查过以确保 session.contents.item("ID") 符合您的预期?如果在任何记录中不等于 [users].[user_id],则不会更新任何内容。
  • 是的,我有,我将完整的 SQL 查询输出到一个字符串来测试它并且语句是正确的。在函数之后,rowsAffected 变量也设置为 1。
  • 我想知道这是否与文本框已经包含用户详细信息这一事实有关,当页面加载时,它需要用户覆盖文本框文本?这可能是一个问题区域吗?
  • 我刚刚将 Page_Load 过程的代码添加到问题中。我认为这可能与我在此过程中使用会话值填充文本框的事实有关,因此它在 UPDATE 语句中使用这些值。我该如何解决这个问题?
  • 你能追踪代码吗?查看文本框设置代码是否在用户更新页面之后但在 SQL 设置和运行之前运行。此外,考虑将所有参数创建代码重构为一个函数,此时可以轻松添加调试开关来检查设置的每个参数的值。

标签: asp.net sql vb.net sql-update


【解决方案1】:

您确定要更新您认为正在更新的数据库吗?我根本不喜欢那个连接字符串的外观(坦率地说,我怀疑 Paul Jarratt 会不会很高兴看到它在这里发布)。

【讨论】:

  • 我正在连接到正确的数据库,我是 Paul Jarratt。
【解决方案2】:

您的页面是否有 RequiresTransaction 属性?如果是这样,请检查在请求期间其他地方没有抛出可能导致事务回滚的异常 - 保持数据不变。

【讨论】:

  • 我的页面中没有 RequiresTransaction。不过我刚刚做了一个测试。目前,该页面将使用用户的会话值填充文本框,并且用户必须覆盖并提交。我已停止使用会话数据的文本框并将它们留空,然后填写文本框并正确更新数据库。所以看来问题是它在运行查询时使用原始文本框值进行更新,即使我覆盖它们?因此它只是用以前的数据更新表而没有改变?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
相关资源
最近更新 更多