记录集中只有1行,但表中的所有行都会更新

时间:2015-05-08 14:45:02

标签: vb6 ado firebird

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

我正在使用vb6和ms ado 2.8

Firebird版本为2.5.4.26856(x64)。

Firebird ODBC驱动程序2.0.3.154

计算机是Windows 7家庭版64位

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

如果我通过选择第二列稍微改变查询,那么客户端姓氏只会在姓氏列中具有与clientid为10021的行的行相同的行进行编辑。

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

当记录集只包含一行

时,我无法理解应该如何编辑多行

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

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

考虑到这一点是有道理的,但是根据我的经验,我编写查询的方式最初似乎工作得很好,或者我错了吗?

1 个答案:

答案 0 :(得分:1)

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

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