|
|
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, люди добрые! Необходимо сравнить 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. По идее нужно запись удалить, но мне её обнулить хотя бы, чтобы потом запросом почистить строки, где поле с нулевым значением. Как исправить не знаю... Может что с кодом в целом? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 13:50 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
1) зачем два объекта типа ADODB.Connection, можно использовать одно и сделать сразу update или delete 2) Rst.Fields(0).Value = "0" скорее всего ошибка здесь. Видать, надо каждое поле по отдельности обрабатывать (присваивать) I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 14:28 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
понятно почему два соединения, папки разные...тогда два конекшена надо что возвращает rstN.Fields(0).Value ? I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 14:31 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
DeViLsssss, Код: plaintext Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.12.2008, 21:24 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
проблема даже не в том, что он значения не меняет, а в том, что он обрабатывает только первую запись...вот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2008, 12:04 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
попробуй так Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2008, 14:09 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Шыфл, что оно делает? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2008, 14:45 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
В общем получилось у меня всё, но приходиться делать rst2.requery каждый раз. Поэтому процесс очень долгий. (база сравниваемая=от 5 MB, база-справочник = 65MB(и будет больше)) Вопрос встает: Как сделать быстрее? Может работать через индексы? Тогда как? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2008, 14:50 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
DeViLsssss (база сравниваемая=от 5 MB, база-справочник = 65MB(и будет больше)) Вопрос встает: Как сделать быстрее? Может работать через индексы? Тогда как? Если есть первичный ключ, то можно Код: plaintext 1. П.С.Написал бы ты обыкновенный SQL запрос а не мучался с курсором :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2008, 15:15 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
А вообще, попробуй сменить провайдера на Microsoft.Jet.OLEDB.4.0 Что-то типа Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.12.2008, 15:24 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Шыфл, друг! Вот серьёзно, делаю запрос, выдает runtime err 80004е005 Недостаточно параметров. Требуется 1. (это если "*" ставить) а если поля конкретные, то цифра = количеству полей. Может я что неправильно делаю? (sql-запрос делаю там, где rst.open) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 07:18 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
конкретно вот как: 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= название изменяемого поля ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 07:43 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
попробовал так conn2.Execute "Update " & ss2 & " Set number=0 where number=" & Rst.Fields(0).Name пишет ошибку синтаксиса в инструкции "update" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 08:18 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
в предыдущем посте ошибка. там rst.fields(0).Value думал что с типами данных, преобразовал всё в число через val(). требует параметр. Что делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 08:45 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Сделал так: 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 минуты. Вопрос: Можно ли ускорить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 10:55 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
А можно как-нибудь запрограммить так, чтобы создавался индекс большого файла, и программа использовала его? Ведь сравнивается, только одно поле... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 11:30 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
а если так ? Код: 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. а по поводу кода, приведенного Вами, зачем делать каждый раз Requery? Да и обновление можно сделать скопом, если использовать ключ adLockBatchOptimistic I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 13:18 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
а если файлы в одной директории, то, вероятно, можно будет одним SQL-запросом удалить ненужные строки I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 13:23 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
пробовал код, приведенный выше. Не проходит из за длины получившейся строки(там 7-8 значные номера). Юзаю adlockbatch, выдает runtime 80004е15. Работа не выполнена (курсор на выполнении удаления записи). Пробую дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 14:41 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
запросы у меня не получаются....а жаль(((((((( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 14:42 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
авторпробовал код, приведенный выше. Не проходит из за длины получившейся строки(там 7-8 значные номера). автор 226 записей вообще-то в string очень много символов влезет сколько вообще записей? авторзапросы у меня не получаются....а жаль(((((((( что значит не получается? ошибка, проблема с синтаксисом или что? I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 16:06 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
DeViLsssss, c синтаксисом мы тебе поможем :) Ты их в одну папочку положи, в тестовую, для простоты s . И сделай следующее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Или сразу Код: plaintext 1. 2. И посмотри, что получилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.12.2008, 17:05 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Шыфл, Спасибо тебе огромное! Теперь я хоть понял как это делать! Вроде сделал! Проверяю! О результатах позже... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2008, 07:36 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
ШыфлDeViLsssss, c синтаксисом мы тебе поможем :) Ты их в одну папочку положи, в тестовую, для простоты s . И сделай следующее Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. Или сразу Код: plaintext 1. 2. И посмотри, что получилось. запрос можно проще сделать, inner join лишний как в ОБНОВЛЕНИИ, так и в УДАЛЕНИИ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2008, 08:04 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Шыфл, не подскажешь, где найти литературу по sql в visual basice. не получается вот что: conn4.Execute "select [city].* from [city] where [city].[index]=" & Str(s) пишет, что не хватает параметра. а какого не пойму... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2008, 08:08 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
авторгде найти литературу по sql в visual basice sql в visual basice - нет sql - это некоторый стандарт, бывают правда небольшие отличия (диалекты) по вопросу: чему будет равно debug.print "select [city].* from [city] where [city].[index]=" & Str(s) index - какой имеет тип? I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2008, 13:53 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
DeViLsssssШыфл, не подскажешь, где найти литературу по sql в visual basice. У тебя сдесь не "sql в visual basice", а самый что нинаесть чистый SQL-92. Вот книги , можно найти и оцифрованные версии. Если у тебя там много работы с данными, я бы тебе советовал завести себе СУБД, хотя бы Ассеss. DeViLsssss не получается вот что: Код: plaintext Это он тебе так пишет, потому что скорее всего ты что-то не правельно написал, а он это принимает за параметр и просит задать его значение. Открой окно Immidiate (ctr+G) и выведи туда строчку да посмотри, что ему может не нравится Код: plaintext P.S. Для того чтобы использовать параметры нужно использовать ADODB.Command ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2008, 14:16 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
HandKot index - какой имеет тип? Тип "строка" поэтому str(s) 2шыфл Спасибо! Попробую. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.12.2008, 15:00 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
DeViLsssssHandKot index - какой имеет тип? Тип "строка" поэтому str(s) при использовании строк в SQL строки надо обертывать символом ' (апостроф) иначе строка воспринимается как параметр пример поиска записи по текстовому полю Код: plaintext поэтому надо делать так Код: plaintext т.е в Вашем случае Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2008, 08:39 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
HandKot, Спасибо тебе огромное! Может когда-нибудь научусь строить эти запросы.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.12.2008, 11:38 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Спасибо вам, ребята, кто помог мне разобраться с запросами!!! Простые понял. Теперь для меня встал вот какой вопрос: conn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & s & ";Extended Properties=dBASE IV;User ID=Admin;Password=;" conn.Open conn.Execute "Insert into [" & s2 & "] select [" & ss2 & "].* from [" & ss2 & "]" conn.Execute "Delete from [" & s2 & "] " & vbCr & "where [" & s2 & "].[DELETED]=1" Есть файл, из которого вставляются данные, потом данные с определенным условием удаляются. Так вот! Здесь есть загвоздка вот какого плана. Поле "deleted" = 0 или 1. (типа "нет" и "да"). В базе, куда записи добавляются, после добавления могут появится одинаковые строки, но с разными значениями поля "deleted". У меня две задумки: 1: сделать запрос на добавление так, чтобы он мог видеть, допустим, что если есть такая строка, то он меняет значение поля "deleted" с 0 на 1, а если нет, то добавляет строку. 2: каким-то образом сделать поиск и удаление дубликатов строк после всех операций. Вот на 2 вариант по-идее можно сделать запрос с вычислением rst.recordcount и удаление одной из записей. Но это долго будет. Строки сравниваются по полю "NUMBER". Оно не уникально (баг тех ко делал изначально эту всю бадягу). Исправить пытался, данные начинают теряться. Если можно как-нибудь подойти к 1 варианту, то дайте намек какой, где копать надо. у меня были подозрения на UPDATE. Тогда у меня не добавляются записи, а только "deleted" меняется. Вот... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2008, 01:05 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
DeViLsssss, что-то я совсем не понял вашу Санта-Барбару :) То ты помечаешь на удаление через обнуление NUMBER, то, аказывается, у тебя там есть поле DELETED как флаг на удаление... :/ Зачем тебе заморачиваться с UPDATE, если в случае чего ты можешь удалить те записи, у которых DELETED=1? И, я так понял, первичного ключа (уникально идентификатора записи) в этой таблице нету? Хотя бы составного, допустим NUMBER + дата, NUMBER+дата+исполнитель? Потому как без первичного ключа много не нарешаешь - это не база, а свалка данных получается... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2008, 04:21 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Шыфл, Шыфлесли в случае чего ты можешь удалить те записи, у которых DELETED=1? Я так и делаю. Мне нужно в базе отыскать дубликаты, и один из них удалить. или хотя бы так же сделать его "deleted"=1 Извиняюсь за некорректно поставленый вопрос, просто время было позднее.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 28.12.2008, 09:42 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
зачем делать инсерт таких же строк? если очень уж надо, то сначала удалить те строки из первого файла, которые есть во втором файле и будут инсертиться, а потом уже инсертить строки в первый файл из второго делается всего лишь добавлением условия в WHERE I Have Nine Lives You Have One Only THINK! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.12.2008, 08:32 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Шыфл! Hard! Помогите плиз! Что не так? conn.Execute "update [" & s2 & "] SET [" & s2 & "].[DELETED] = '1' where [" & ss2 & "].[NUMBER] = [" & s2 & "].[NUMBER]" пишет "недостаточно параметров". conn.Execute "update [" & s2 & "] SET [" & s2 & "].[DELETED] = '1' as t where [" & ss2 & "].[NUMBER] = [" & s2 & "].[NUMBER]" пишет "пропущен оператор". убирал апострофы у 1 не помогает. делал так: conn.execute "update [" & s2 & "] set [" & s2 & "].[DELETED]=1 where [" & s2 & "].[NUMBER] in " & _ "(select [t].[NUMBER] from [" & s2 & "] as t inner join [" & ss2 & "] as tt on [t].[NUMBER] = [tt].[NUMBER])" то же самое Что делать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.01.2009, 01:02 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
DeViLsssss, Ты выведи строку, которую исполняешь уже в значениях. Похоже что у тебя опечатка в имени таблицы... :/ но телепатор может врать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2009, 00:53 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Шыфл, Спасибо! Только что докопался! conn.Execute "update [" & s2 & "] SET [" & s2 & "].[DELETED] = '1' where [" & s2 & "].[NUMBER] in " & _ "(select [t].[NUMBER] from " & ss2 & " as t inner join [" & s2 & _ "] as tt on [t].[NUMBER] = [tt].[NUMBER])" ошибка была после where. у меня стояла ss2 а нужно было s2. Вот! Ну это-то ладно! Это круто! а вот приблизительно как можно сделать запрос так, чтобы было что-то примерно такое conn.Execute "update [" & s2 & "] SET [" & s2 & "].[DATEDEL] = [" & ss2 & "].[DATEDEL] where [" & s2 & "].[NUMBER] in " & _ "(select [t].[NUMBER] from " & ss2 & " as t inner join [" & s2 & _ "] as tt on [t].[NUMBER] = [tt].[NUMBER])" сейчас делаю перебирая рекордсет, но это долговато... Я понимаю что нужно прописать что-то типа [" & ss2 & "].[DATEDEL] as XXX. Но не работает. Пишет что пропущен оператор. Где мой косяк? Кстати! С прошедшими праздниками! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2009, 01:17 |
|
||
|
ошибка в инструкции update при выполнении операций с dbf через ADO
|
|||
|---|---|---|---|
|
#18+
Да и ещё! У меня такая штука вылазит "данный метод сортировки не поддерживается системой". Но только после первого запуска операций! А если второй, третий разы кнопку жать, то все без проблем. почему может быть? Работаю через драйвер MS Jet4.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.01.2009, 01:26 |
|
||
|
|

start [/forum/topic.php?all=1&fid=60&tid=2161469]: |
0ms |
get settings: |
7ms |
get forum list: |
18ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
71ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
85ms |
get tp. blocked users: |
2ms |
| others: | 205ms |
| total: | 411ms |

| 0 / 0 |
