Only 1 row in recordset but all rows in table get updated

≡放荡痞女 提交于 2019-12-12 16:22:43

问题


The query retrieves a single record as is confirmed by the recordcount but every single row in the table gets updated

I am using vb6 and ms ado 2.8

The Firebird version is 2.5.4.26856 (x64).

Firebird ODBC driver 2.0.3.154

The computer is 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

If I alter the query slightly by also selecting a second column, the client surname then only rows with the same value in the surname column as that of of the row where the clientid is 10021 get edited.

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

I cannot understand how more than one row should be edited when the recordset contains only a single row

EDIT: Having read around the web a bit this is my understanding of what is happening. It seems that the update method identifies which records to update based on the selected columns in the recordset. So if you select fields a,b,c,d and are updating field a, it will only update records in the database whose values for a,b,c,d match those in the recordset. The best way to ensure that you only update a single record is to include the primary key in the selected fields. So if I had written my query as in the line below, only a single record would have been updated because the clientID column contains unique values.

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

It makes sense thinking about it but the way I wrote the query originally seems to work fine, in my experience, with other databases or am I wrong?


回答1:


i tested your code everything was fine and only update one row. i only want to suggest you a simple way to check whether record exist or not. that could be like this :

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


来源:https://stackoverflow.com/questions/30126619/only-1-row-in-recordset-but-all-rows-in-table-get-updated

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!