【问题标题】:ASP.NET - VB.NET - Updating MS_Access tableASP.NET - VB.NET - 更新 MS_Access 表
【发布时间】:2012-03-28 16:50:06
【问题描述】:

我正在尝试使用 VB.NET 和 ASP.NET 更新 Ms-Access 表中的记录。我收到 2 个错误:

  • 在打开的网页上,我收到了Thread was being aborted
  • Web Developer 2010 给我一个错误,说在 更新语句

这是目前为止的代码:

Imports System.Data.OleDb


Partial Class ChangePassword
    Inherits System.Web.UI.Page

    Protected Sub btnChange_Click(sender As Object, e As System.EventArgs) Handles btnChange.Click

        Dim tUserID As String = Session("UserID")

        Dim conn As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Users\Brian\Documents\Visual Studio 2010\WebSites\WebSite3\db.mdb;")

        conn.Open()

        Dim cmd As OleDbCommand = New OleDbCommand("SELECT * FROM [User] where UserID=?", conn)

        Dim cmd2 = New OleDbCommand("UPDATE USER SET [Password] = '" + txtConfPass.Text + "' where UserID = '" + tUserID + "'", conn)

        cmd.Parameters.AddWithValue("@UserID", tUserID)

        Dim read As OleDbDataReader = cmd.ExecuteReader()
        Dim read2 As OleDbDataReader = cmd2.ExecuteReader()


        lblUser.Text = tUserID.ToString
        lblUser.Visible = True

        If read.HasRows Then
            While read.Read()

                If txtOldPass.Text = read.Item("Password").ToString Then

                    cmd2.ExecuteNonQuery()

                    lblPass.Visible = True


                End If
            End While

        Else
            lblPass.Text = "Invalid Password."
            lblPass.Visible = True

        End If

        conn.Close()

        lblPass.Text = tUserID.ToString
        lblPass.Visible = True

任何帮助将不胜感激。

谢谢!

【问题讨论】:

  • 嗯,这里有一些问题。您的密码设置 SQL 会受到 SQL 注入攻击,这都是非常老派的。您是否考虑过为此使用 SQL Server Express?它确实更适合。

标签: asp.net sql vb.net ms-access


【解决方案1】:
  • 首先,您的 cmd2 失败,因为 USER 是保留字。附在 方括号,就像您在第一个 OleDbCommand 中所做的那样。
  • 其次,执行您调用的 UPDATE、INSERT、DELETE 等语句 cmd2.ExecuteNonQuery 不是 ExecuteReader。真的不需要那个电话 在第一个用于 cmd 之后。
  • 第三,在第一个 OleDbCommand (cmd) 中使用参数 UserID,为什么在第二个中您恢复为字符串连接 用户名和密码?这为任何类型的 Sql 注入打开了大门 攻击。
  • 第四,Using 语句确保每个 Disposable 对象 在您的代码中使用的将是 CLOSED 从而释放所使用的内存 这个命令也有例外情况。 Using statement here 的一个例子

【讨论】:

  • Steve - 好的,我更改了这些,但我认为我在会话方面遇到了错误,因为它告诉我没有为 cmd 提供任何值。
  • 另外,在网页上,当我运行 Web 应用程序时,它给了我“线程被中止”。这是什么意思?
  • 只能建议检查enabling Session State的所有内容
【解决方案2】:

(1)

Dim read2 As OleDbDataReader = cmd2.ExecuteReader()

然后

(2)

cmd2.ExecuteNonQuery()

删除 (1) - ExecuteNonQuery 应该进行更新。

USER 是 Access 中的关键字,添加括号的方式与您在 Select 语句中添加的方式相同。下次遇到类似的问题,打印出 Access 看到的语句,然后直接在数据库上执行,这样可以准确指出错误。

请使用类似于 select 语句的更新语句的占位符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-30
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多