Этот вопрос связан с тем, который я задал ранее here.Различное поведение наборов записей postgresql и firebird
Запрос в базе данных firebird получил набор записей одной строки, поскольку В том случае, когда в пункте включен первичный ключ. Однако при последующем обновлении почти каждая строка в таблице была обновлена. Я ожидал обновления только одной строки. Это был запрос:
sQuery = "select memo from clients where clientID = 10021 "
Что происходит, кажется, что запрос на выборку необходимо включить столбца первичного ключа в наборе записей, чтобы ограничить обновление только одной записи.
sQuery = "select memo, clientID from clients where clientID = 10021 "
Однако в PostgreSQL, первый запрос работает так, как второй запрос работает в Жаре.
Могу ли я полагаться на это поведение в postgresql, или я должен переписать существующие запросы, чтобы включить столбец первичного ключа в наборах записей, которые впоследствии будут обновлены?
Есть ли способ заставить запросы firebird вести себя так, как это делает postgresql?
Хотя я теперь могу видеть логику поведения firebird, это не то, что Я привык поступать с фона MSAccess/DAO.
Действительно, я просто хочу знать, что происходит, и что является более «нормальным» поведением, которое следует ожидать от наборов записей ADO?
Это полный код с использованием firebird.
'FIREBIRD
'vb6 and ms ado 2.8
'windows 7 home edition 64 bit
'Firebird version is 2.5.4.26856 (x64).
'Firebird ODBC driver 2.0.3.154
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
Это тот же код с использованием базы данных postgresql;
'POSTGRESQL
'vb6 and ms ado 2.8
'windows 7 home edition 64 bit
Postgresql version is 9.4 64 bit
psql ODBC driver 9.3.4
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={PostgreSQL ANSI};SERVER=localhost;Port=5432;DATABASE=Parkes;UID=postgres;PWD=masterkey;CONNSETTINGS=SET Datestyle TO 'DMY'%3b;BOOLSASCHAR=0;TEXTASLONGVARCHAR=1;TrueIsMinus1=1;"
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