ASP.NET - VB.NET - 更新 MS_Access 表

Posted

技术标签:

【中文标题】ASP.NET - VB.NET - 更新 MS_Access 表【英文标题】:ASP.NET - VB.NET - Updating MS_Access table 【发布时间】: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?它确实更适合。 【参考方案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 语句的更新语句的占位符。

【讨论】:

以上是关于ASP.NET - VB.NET - 更新 MS_Access 表的主要内容,如果未能解决你的问题,请参考以下文章

使用 asp.net、vb.net 和 ms-access 的时间戳

ASP.NET - VB.NET - 从 MS-Access 数据库中检索记录

用C#编写的asp.net 和 vb.net编写的asp.net 有性能上的差异吗?

PDF 生成后无法打开 (vb.net) (asp.net)

使用 ASP.net 监控数据库中的更新和删除

VB.NET/ASP.NET 4.0 自定义配置部分:“创建配置部分处理程序时出错”