【发布时间】: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