powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ошибка в инструкции update при выполнении операций с dbf через ADO
25 сообщений из 39, страница 1 из 2
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35727760
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, люди добрые!
Необходимо сравнить 2 файла с различной структурой (в одной урезаны некоторые поля)
есть код:

Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};" & "DBQ=" & s & ";" & "DefaultDir=" & s & "\"
conn.Open
Set Rst = New ADODB.Recordset
s3 = "SELECT * FROM " & s2
Rst.Open s3, conn, dbOpenStatic, adLockOptimistic

Set conn2 = New ADODB.Connection
conn2.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};" & "DBQ=" & ss & ";" & "DefaultDir=" & ss & "\"
conn2.Open
Set rst2 = New ADODB.Recordset
ss3 = "SELECT * FROM " & ss2
rst2.Open ss3, conn2

Do Until Rst.EOF
s6 = Rst.Fields(0).Value
Do Until rst2.EOF
s7 = rst2.Fields(0).Value
If s6 = s7 Then
Rst.Fields(0).Value = "0"
Rst.update
End If
rst2.MoveNext
Loop
Rst.MoveNext
Loop

Rst.Close: Set Rst = Nothing
conn.Close: Set conn = Nothing
rst2.Close: Set rst2 = Nothing
conn2.Close: Set conn2 = Nothing


после обработки первой записи, выдается runtime error (80004005): Ошибка синтаксиса в инструкции Update.

По идее нужно запись удалить, но мне её обнулить хотя бы, чтобы потом запросом почистить строки, где поле с нулевым значением.

Как исправить не знаю... Может что с кодом в целом?
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35727912
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) зачем два объекта типа ADODB.Connection, можно использовать одно и сделать сразу update или delete
2) Rst.Fields(0).Value = "0" скорее всего ошибка здесь. Видать, надо каждое поле по отдельности обрабатывать (присваивать)


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35727925
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
понятно почему два соединения, папки разные...тогда два конекшена надо

что возвращает rstN.Fields(0).Value ?

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35728893
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeViLsssss,
Код: plaintext
Rst.Fields( 0 ).Value = "0"
Есть предположение, что "0" - это string, а нужно число. Попробуй
Код: plaintext
Rst.Fields( 0 ).Value =  0 
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35729724
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
проблема даже не в том, что он значения не меняет, а в том, что он обрабатывает только первую запись...вот...
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35730147
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
попробуй так
Код: plaintext
1.
2.
3.
conn2.BeginTrans
Rst.Fields( 0 ).Value = "0"
Rst.update
conn2.CommitTrans
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35730256
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шыфл,

что оно делает?
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35730268
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем получилось у меня всё, но приходиться делать rst2.requery каждый раз.
Поэтому процесс очень долгий.
(база сравниваемая=от 5 MB, база-справочник = 65MB(и будет больше))

Вопрос встает: Как сделать быстрее? Может работать через индексы? Тогда как?
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35730343
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeViLsssss
(база сравниваемая=от 5 MB, база-справочник = 65MB(и будет больше))
Вопрос встает: Как сделать быстрее? Может работать через индексы? Тогда как?
Если есть первичный ключ, то можно
Код: plaintext
1.
conn2.Execute "Update " & ss2 & " Set " & rst2.Fields( 0 ).Name & "=0 where " '+условие ключа.

П.С.Написал бы ты обыкновенный SQL запрос а не мучался с курсором :)
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35730388
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, попробуй сменить провайдера на Microsoft.Jet.OLEDB.4.0

Что-то типа
Код: plaintext
1.
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s & ";Extended Properties=dBASE IV;User ID=Admin;Password=;"
Может помочь.
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35731368
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шыфл, друг!
Вот серьёзно, делаю запрос, выдает runtime err 80004е005
Недостаточно параметров. Требуется 1. (это если "*" ставить)

а если поля конкретные, то цифра = количеству полей.

Может я что неправильно делаю?

(sql-запрос делаю там, где rst.open)
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35731375
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
конкретно вот как:


Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};" & "DBQ=" & s & ";" & "DefaultDir=" & s & "\"
conn.Open

Set Rst = New ADODB.Recordset
s3 = "SELECT * FROM " & s2
Rst.Open s3, conn, dbOpenStatic, adLockOptimistic

Do Until Rst.EOF

Set conn2 = New ADODB.Connection
conn2.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};" & "DBQ=" & ss & ";" & "DefaultDir=" & ss & "\"
conn2.Open

Set Rst2 = New ADODB.Recordset
ss3 = "Update " & ss2 & " Set NUMBER=0 where NUMBER=" & Rst.Fields(0).Value
Rst2.Open ss3, conn2

Rst2.Close: Set Rst2 = Nothing
conn2.Close: Set conn2 = Nothing
Rst.MoveNext
Loop
Rst.Close: Set Rst = Nothing
conn.Close: Set conn = Nothing


NUMBER= название изменяемого поля
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35731397
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
попробовал так
conn2.Execute "Update " & ss2 & " Set number=0 where number=" & Rst.Fields(0).Name
пишет ошибку синтаксиса в инструкции "update"
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35731430
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
в предыдущем посте ошибка. там rst.fields(0).Value
думал что с типами данных, преобразовал всё в число через val().
требует параметр. Что делать?
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35731685
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сделал так:

Set conn = New ADODB.Connection
conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s & ";Extended Properties=dBASE IV;User ID=Admin;Password=;"
conn.Open
Set rst = New ADODB.Recordset
s3 = "SELECT * FROM " & s2
rst.Open s3, conn, dbOpenStatic, adLockOptimistic

Set conn2 = New ADODB.Connection
conn2.Provider = "Microsoft.Jet.OLEDB.4.0"
conn2.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ss & ";Extended Properties=dBASE IV;User ID=Admin;Password=;"
conn2.Open
Set rst2 = New ADODB.Recordset
ss3 = "SELECT * FROM " & ss2
rst2.Open ss3, conn2 ' , dbOpenStatic, adLockOptimistic
Do Until rst.EOF
s6 = Val(rst.Fields(0))
Do Until rst2.EOF
s7 = Val(rst2.Fields(0))
If s6 = s7 Then
rst.Delete
rst.Update
GoTo 1
Else
rst2.MoveNext
End If
Loop
1:
rst2.Requery
rst.MoveNext
Loop
rst2.Close: Set rst2 = Nothing
conn2.Close: Set conn2 = Nothing
rst.Close: Set rst = Nothing
conn.Close: Set conn = Nothing


работает. 226 записей за 22 минуты.
Вопрос: Можно ли ускорить?
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35731790
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно как-нибудь запрограммить так, чтобы создавался индекс большого файла, и программа использовала его? Ведь сравнивается, только одно поле...
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35732142
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если так ?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
    Dim conn As ADODB.Connection
    Dim rst As ADODB.Recordset
    Dim sValue As String
    
    Set conn = New ADODB.Connection
    Set rst = New ADODB.Recordset
    
    'выбираем значения для сверки
    conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s & ";Extended Properties=dBASE IV;User ID=Admin;Password=;"
    conn.Open
    
    s3 = "SELECT MyField FROM " & s2
    
    rst.Open s3, conn, dbOpenStatic, adLockReadOnly
    
    sValue = rst.GetString(, , , "!")
        
    rst.Close
    conn.Close
        
    'удаляем лишнее в другой таблице
    conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ss & ";Extended Properties=dBASE IV;User ID=Admin;Password=;"
    conn.Open
    
    s3 = "SELECT * FROM " & ss2
    rst.Open s3, conn, adOpenKeyset, adLockBatchOptimistic
    
    Do Until rst.EOF
        If InStr( 1 , "!" + rst.Fields( 0 ) + "!", sValue) <>  0  Then
            rst.Delete
        End If
        
        rst.MoveNext
    Loop
    
    'сохраняем внесенные изменения
    rst.UpdateBatch
    
    'уничтожаем объекты
    rst.Close: Set rst = Nothing
    conn.Close: Set conn = Nothing

а по поводу кода, приведенного Вами, зачем делать каждый раз Requery? Да и обновление можно сделать скопом, если использовать ключ adLockBatchOptimistic

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35732159
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если файлы в одной директории, то, вероятно, можно будет одним SQL-запросом удалить ненужные строки


I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35732473
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
пробовал код, приведенный выше. Не проходит из за длины получившейся строки(там 7-8 значные номера). Юзаю adlockbatch, выдает runtime 80004е15. Работа не выполнена (курсор на выполнении удаления записи). Пробую дальше.
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35732474
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
запросы у меня не получаются....а жаль((((((((
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35732804
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторпробовал код, приведенный выше. Не проходит из за длины получившейся строки(там 7-8 значные номера).
автор 226 записей

вообще-то в string очень много символов влезет

сколько вообще записей?

авторзапросы у меня не получаются....а жаль((((((((
что значит не получается?
ошибка, проблема с синтаксисом или что?

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35733043
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeViLsssss, c синтаксисом мы тебе поможем :)

Ты их в одну папочку положи, в тестовую, для простоты s . И сделай следующее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};" & "DBQ=" & s & ";" & "DefaultDir=" & s & "\"
conn.Open

'обновление

conn.execute "update [" & ss2 & "] set [" & ss2 & "].[NUMBER]=0 where [" & ss2 & "].[NUMBER] in " & _
"(select [t].[NUMBER] from [" & ss2 & "] as t inner join [" & s2 & "] as tt on [t].[NUMBER] = [tt].[NUMBER])"


Или сразу

Код: plaintext
1.
2.
'удаление
conn.execute "Delete from [" & ss2 & "] where [" & ss2 & "].[NUMBER] in " & _
"(select [t].[NUMBER] from [" & ss2 & "] as t inner join [" & s2 & "] as tt on [t].[NUMBER] = [tt].[NUMBER])"

И посмотри, что получилось.
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35733917
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шыфл,

Спасибо тебе огромное! Теперь я хоть понял как это делать!
Вроде сделал!
Проверяю!
О результатах позже...
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35733927
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ШыфлDeViLsssss, c синтаксисом мы тебе поможем :)

Ты их в одну папочку положи, в тестовую, для простоты s . И сделай следующее

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
Set conn = New ADODB.Connection
conn.ConnectionString = "DRIVER={Microsoft dBase Driver (*.dbf)};" & "DBQ=" & s & ";" & "DefaultDir=" & s & "\"
conn.Open

'обновление

conn.execute "update [" & ss2 & "] set [" & ss2 & "].[NUMBER]=0 where [" & ss2 & "].[NUMBER] in " & _
"(select [t].[NUMBER] from [" & ss2 & "] as t inner join [" & s2 & "] as tt on [t].[NUMBER] = [tt].[NUMBER])"


Или сразу

Код: plaintext
1.
2.
'удаление
conn.execute "Delete from [" & ss2 & "] where [" & ss2 & "].[NUMBER] in " & _
"(select [t].[NUMBER] from [" & ss2 & "] as t inner join [" & s2 & "] as tt on [t].[NUMBER] = [tt].[NUMBER])"

И посмотри, что получилось.


запрос можно проще сделать, inner join лишний как в ОБНОВЛЕНИИ, так и в УДАЛЕНИИ
...
Рейтинг: 0 / 0
ошибка в инструкции update при выполнении операций с dbf через ADO
    #35733930
DeViLsssss
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Шыфл, не подскажешь, где найти литературу по sql в visual basice.
не получается вот что:

conn4.Execute "select [city].* from [city] where [city].[index]=" & Str(s)

пишет, что не хватает параметра. а какого не пойму...
...
Рейтинг: 0 / 0
25 сообщений из 39, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ошибка в инструкции update при выполнении операций с dbf через ADO
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]