【问题标题】:Only 1 row in recordset but all rows in table get updated记录集中只有 1 行,但表中的所有行都会更新
【发布时间】:2015-05-08 14:45:01
【问题描述】:

该查询检索到由记录计数确认的单个记录,但表中的每一行都会更新

我正在使用 vb6 和 ms ado 2.8

Firebird 版本是 2.5.4.26856 (x64)。

火鸟 ODBC 驱动程序 2.0.3.154

电脑是windows 7 home edition 64 bit

Dim cn As New ADODB.Connection
Dim rs As New ADODB.Recordset

Dim cs As String
Dim dbPath As String

dbPath = "c:\Parkes\Parkes.fdb"
cs = "DRIVER={Firebird/Interbase(r) Driver}; DBNAME=localhost:" & dbPath & "; UID=SYSDBA; PWD=masterkey;"
cn.ConnectionString = cs
cn.Open

Dim sQuery As String

sQuery = "select memo from clients where clientID = 10021 "
rs.Open sQuery, cn, adOpenStatic, adLockOptimistic

If rs.BOF <> True Or rs.EOF <> True Then
'putting msgbox rs.recordcount here confirms only 1 record in recordset
    rs.Movefirst
    rs.Fields("memo") = "blah"
    rs.Update

End If

Set rs = Nothing
Set cn = Nothing

如果我通过选择第二列稍微改变查询,那么只有在 surname 列中与 clientid 为 10021 的行具有相同值的行才会被编辑。

sQuery = "select memo, surname from clients where clientID = 10021 "

当记录集只包含一行时,我无法理解如何编辑多行

编辑:在网上阅读了一下,这是我对正在发生的事情的理解。 似乎 update 方法根据记录集中的选定列确定要更新的记录。 因此,如果您选择字段 a、b、c、d 并更新字段 a,它只会更新数据库中 a、b、c、d 的值与记录集中的值匹配的记录。 确保只更新一条记录的最佳方法是在所选字段中包含主键。 因此,如果我按照以下行编写查询,则只会更新一条记录,因为 clientID 列包含唯一值。

sQuery = "select memo, clientID from clients where clientID = 10021 "

考虑一下是有道理的,但根据我的经验,我最初编写查询的方式似乎可以正常工作,与其他数据库一起使用还是我错了?

【问题讨论】:

  • 我猜这应该被认为是驱动程序中的一个错误;您期望它只更新所选记录是正确的(据我所知,我不经常使用 ADO 或 ODBC)。包含主键的解决方法是一个很好的解决方法,或者您可以包含伪列 RDB$DB_KEY 来标识记录。
  • @mark Rotteveel,在阅读了您的评论后,我使用 ADO 和 Access 数据库尝试了相同的代码。仅更新了一条记录,支持您的建议,即这是 firebird odbc 驱动程序中的错误。如果是这样的话,我很高兴,因为否则我已经做错了很长时间了!谢谢!
  • 您可能希望在tracker.firebirdsql.org/browse/ODBC上创建错误报告
  • @mark Rotteveel,是的,我已经做到了 :-) tracker.firebirdsql.org/secure/IssueNavigator.jspa
  • 我猜你的意思是:tracker.firebirdsql.org/browse/ODBC-186

标签: vb6 ado firebird


【解决方案1】:

我测试了你的代码,一切都很好,只更新了一行。我只想向您建议一种简单的方法来检查记录是否存在。可能是这样的:

if rs.rows.count > 0 then
   ' no need to move recordset to first by default its on the first row
end if

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-11
    • 2015-10-13
    • 2013-10-19
    • 2016-04-21
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多