2015-05-08 2 views
2

Этот вопрос связан с тем, который я задал ранее 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 

ответ

1

На основании ответа here и майкрософт article, что было связано с там, кажется, тот случай, когда Жар драйвер ODBC работает по-разному (в большинстве случаев?) Других драйверов ODBC, дизайн.

Ссылка на API Microsoft ADO указывает, что метод Update должен обновлять текущую запись.

Жар драйвер работает по-разному, и это проще объяснить, как с помощью некоторых примеров

В случае ниже, записей содержит только одну запись (потому что ClientID является первичным ключом и, таким образом, уникальный), и предположим, что значение в поле для заметок это «бинго». Метод обновления изменит значение «blah» значения поля memo для всех строк в таблице, имеющим значение «bingo».

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

    If rs.BOF <> True Or rs.EOF <> True Then 
     rs.Movefirst 
     rs.Fields("memo") = "blah" 
     rs.Update 

    End If 

В следующем примере снова записей содержит только одну запись, но теперь 2 колонки и предположим, что значение в мемо поле «лото», а значение в поле фамилию «Jones». Метод обновления изменит значение «blah» значения поля memo для всех строк в таблице, чьи существующие значения имеют «бинго» в их поле memo и «Jones» в поле их фамилии.

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

    If rs.BOF <> True Or rs.EOF <> True Then 
     rs.Movefirst 
     rs.Fields("memo") = "blah" 
     rs.Update 

    End If 

Очевидно, это может все еще не ограничивать обновление одной строкой. Чтобы обновить только одну строку, вам необходимо включить столбец с уникальными значениями в наборе записей, например столбец первичного ключа:

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

     If rs.BOF <> True Or rs.EOF <> True Then 
      rs.Movefirst 
      rs.Fields("memo") = "blah" 
      rs.Update 

     End If 
Смежные вопросы