Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ошибка в инструкции update при выполнении операций с dbf через ADO / 25 сообщений из 39, страница 1 из 2
22.12.2008, 13:50
    #35727760
DeViLsssss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
Здравствуйте, люди добрые!
Необходимо сравнить 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
22.12.2008, 14:28
    #35727912
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
1) зачем два объекта типа ADODB.Connection, можно использовать одно и сделать сразу update или delete
2) Rst.Fields(0).Value = "0" скорее всего ошибка здесь. Видать, надо каждое поле по отдельности обрабатывать (присваивать)


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

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

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

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

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

П.С.Написал бы ты обыкновенный SQL запрос а не мучался с курсором :)
...
Рейтинг: 0 / 0
23.12.2008, 15:24
    #35730388
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
А вообще, попробуй сменить провайдера на 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
24.12.2008, 07:18
    #35731368
DeViLsssss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
Шыфл, друг!
Вот серьёзно, делаю запрос, выдает runtime err 80004е005
Недостаточно параметров. Требуется 1. (это если "*" ставить)

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

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

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


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

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
24.12.2008, 11:30
    #35731790
DeViLsssss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
А можно как-нибудь запрограммить так, чтобы создавался индекс большого файла, и программа использовала его? Ведь сравнивается, только одно поле...
...
Рейтинг: 0 / 0
24.12.2008, 13:18
    #35732142
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
а если так ?
Код: 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
24.12.2008, 13:23
    #35732159
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
а если файлы в одной директории, то, вероятно, можно будет одним SQL-запросом удалить ненужные строки


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

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

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

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

I Have Nine Lives You Have One Only
THINK!
...
Рейтинг: 0 / 0
24.12.2008, 17:05
    #35733043
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
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
25.12.2008, 07:36
    #35733917
DeViLsssss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
Шыфл,

Спасибо тебе огромное! Теперь я хоть понял как это делать!
Вроде сделал!
Проверяю!
О результатах позже...
...
Рейтинг: 0 / 0
25.12.2008, 08:04
    #35733927
HandKot
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
Шыфл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
25.12.2008, 08:08
    #35733930
DeViLsssss
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ошибка в инструкции update при выполнении операций с dbf через ADO
Шыфл, не подскажешь, где найти литературу по sql в visual basice.
не получается вот что:

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

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


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