【问题标题】:Updating VB.Net Database With SQL Update Statement使用 SQL 更新语句更新 VB.Net 数据库
【发布时间】:2017-04-07 14:23:37
【问题描述】:

所以我得到了更新语句,并且正在更新数据库中的记录。但是,在更新记录后程序会抛出错误。

错误

System.Data.dll 中出现“System.Data.OleDb.OleDbException”类型的未处理异常

附加信息:您请求对表的更改未成功,因为它们会在索引、主键或关系中创建重复值。更改包含重复数据的一个或多个字段中的数据,删除索引,或重新定义索引以允许重复条目,然后重试。

代码

        Dim variable As String
        dsConnectionM.Open()
        variable = "UPDATE Member SET MemberID = '" & Form3.tbid.Text & "', Forename = '" & Form3.tbfn.Text & "' "
        Dim cmd As OleDbCommand = New OleDbCommand(variable, dsConnectionM)
        cmd.ExecuteNonQuery()
        dsConnectionM.Close()

I don't know if this is normal but when ran a second Access file for the database is created

This shows the contents of "Member" in the databse

已编辑

我开始使用参数,因为我得到了另一个错误的建议。

错误

System.Data.dll 中出现“System.Data.OleDb.OleDbException”类型的未处理异常

附加信息:UPDATE 语句中的语法错误。

代码

Dim variable As String
dsConnectionM.Open()
variable = "UPDATE Member 
            SET Forename = @Forename,
                Surname = @Surname, 
                DOB = @DOB, 
                Section = @Section, 
                Postcode = @Postcode,
                HomeTel = @HomeTel, 
                MobileTel = @MobileTel, 
                AddressLine1 = @AddressLine1, 
                AddressLine2 = @AddressLine2, 
                City = @City, 
                EmailAddress = @EmailAddress, 
                P/GForename = @P/GForename, 
                P/GSurname = @P/GSurname
           WHERE MemberID = @MemberID"
        Dim cmd As OleDbCommand = New OleDbCommand(variable, dsConnectionM)
        cmd.Parameters.AddWithValue("@MemberID", Form3.tbid.Text)
        cmd.Parameters.AddWithValue("@Forename", Form3.tbfn.Text)
        cmd.Parameters.AddWithValue("@Surname", Form3.tbsn.Text)
        cmd.Parameters.AddWithValue("@DOB", Form3.dtpdob.Value)
        cmd.Parameters.AddWithValue("@Section", Form3.tbsr.Text)
        cmd.Parameters.AddWithValue("@Postcode", Form3.tbpc.Text)
        cmd.Parameters.AddWithValue("@HomeTel", Form3.tbht.Text)
        cmd.Parameters.AddWithValue("@MobileTel", Form3.tbmt.Text)
        cmd.Parameters.AddWithValue("@AddressLine1", Form3.tbal1.Text)
        cmd.Parameters.AddWithValue("@AddressLine2", Form3.tbal2.Text)
        cmd.Parameters.AddWithValue("@City", Form3.tbc.Text)
        cmd.Parameters.AddWithValue("@EmailAddress", Form3.tbea.Text)
        cmd.Parameters.AddWithValue("@P/GForename", Form3.tbpgfn.Text)
        cmd.Parameters.AddWithValue("@P/GSurname", Form3.tbpgsn.Text)
        cmd.ExecuteNonQuery()
        dsConnectionM.Close()

【问题讨论】:

  • 错误消息很清楚,您正在尝试将 MemberID 设置为数据库中已有的值,因此会导致主键/唯一约束冲突。
  • 这两个语句(它更新并抛出异常)不可能是真的,除非你有代码调用那个孤立的 sn-p 两次。同样,很长一段时间以来,这都不是创建 SQL 的正确方法;使用 SQL 参数。请阅读How to Ask 并采取tour
  • 你可能问错了问题What is the XY problem?
  • 来自 MSDN:OLE DB.NET Framework 数据提供程序使用位置参数...参数必须按照与 sql 命令中相同的顺序列出。
  • 另外,您的列 P/GForname 和 P/GSurname 似乎有点可疑,而是使用下划线 P_GForname 和 P_GSurname 以确保安全。

标签: sql vb.net ms-access


【解决方案1】:

通常你不会UPDATEPk 一个表。在您的表单中,ID 应该是只读的。如果有人更改了其他值,您可以使用ID 来查找UPDATE 所在的行

variable = "UPDATE Member " &
           "SET Forename = '" & Form3.tbfn.Text & "' "
           "WHERE MemberID = '" & Form3.tbid.Text & "'

而且你需要使用参数,否则你很容易受到 SQL 注入的攻击

【讨论】:

  • 让它更新 where memberId = 不管什么解决了问题,但现在我怎么能编辑到 memberID?
  • 正如我所说,你不应该在表中更新MemberID Members 你可能做错了什么。也许尝试分享和举例说明您需要什么以及您的结果应该是什么。也许是你的表格的图片。
  • 大家好,我更新了代码,又遇到了一个错误。
  • 我不会使用斜线字符 / 尝试使用下划线 _ 命名参数
  • 但在数据库中是这样的。
【解决方案2】:

我假设您的查询旨在更改具有特定 ID 的成员的名字字段。

在这种情况下,您的查询应该如下所示

UPDATE Member SET Forename = '" & Form3.tbfn.Text & "' where MemberID = '" & Form3.tbid.Text & "'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 2011-01-28
    • 2013-01-26
    • 2014-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多