Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / ADO - Как убедиться что Execute отработал / 25 сообщений из 47, страница 1 из 2
30.03.2010, 17:58
    #36551241
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
авторCa.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=data/arhiv/" + strSur + ";Jet OLEDB:Database Password=" + MainForm.Pas + ";"

Ca.Open

'Чистим таблицу
Mconn.Execute ("DELETE arh_rep.* FROM arh_rep")

' ДОБАВЛЯЕМ ДАННЫЕ ИЗ ДРУГОГО mdb ВО временную таблицу для СОЗДАНИЯ отчетов ЗА архивныЕ ЕРИОДЫ

Ca.Execute ("INSERT INTO arh_rep IN'" + App.Path + "\Data\kvartplata.amd' SELECT Adding.* FROM Adding WHERE (((Adding.KodKv)=" + Номер + "));")
.
.
.
потом
'Открываем Рекордсет

rsLg.Open ("SELECT arh_rep.DataT AS Дата, arh_rep.NameKat AS Категория, arh_rep.KodN AS Код, arh_rep.NameN AS Начисление, arh_rep.ObPl AS Площадь, arh_rep.Propis AS Прописано, arh_rep.Tarif AS [Тариф(осн)], arh_rep.TarifI AS [Тариф(доп)], arh_rep.Shc_new AS Счетчик, IIf([arh_rep]![Tip]='-',[arh_rep]![SummaI],0) AS Начислено, IIf([arh_rep]![Tip]='+',[arh_rep]![SummaI],0) AS Оплачено, IIf([arh_rep]![Tip]='s',[arh_rep]![SummaI],0) AS Субсидии FROM arh_rep ORDER BY arh_rep.DataT, arh_rep.NameKat, arh_rep.KodN"), Mconn
СУТЬ ПРОБЛЕМЫ:
ИМХО
Пока срабатывет Ca.Execute rsLg.Open забирает данные с пустой таблицы предврительно очищенной при помощи Mconn.Execute ("DELETE arh_rep.* FROM arh_rep")
Ставил задержки в циклах, выводил ProgressBar-ы не помогает.
Если убрать предварительную очистку таблицы срабатывет после 2-3-го запуска(иногда и после первого).
Как убедиться что Ca.Execute отработал полностью и можно двигаться дальше. Или МОЖЕТ подскажите кто знает какой тип курсора надо поставить, что бы все работало по порядку?

Всем зараннее спасибо.
...
Рейтинг: 0 / 0
30.03.2010, 18:01
    #36551250
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13
Как убедиться что Ca.Execute отработал полностью и можно двигаться дальше. Или МОЖЕТ подскажите кто знает какой тип курсора надо поставить, что бы все работало по порядку?

1) Попробуйте серверный курсор
2) А почему бы не работать с одним и тем же коннекшном?
...
Рейтинг: 0 / 0
30.03.2010, 18:16
    #36551287
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Один конэкт "Ca" в цикле переберает кучу архивных баз т.е. Cn.Open Execute(копирует нужные данные во временную таблицу всегда открытую при помощи Mconn) потом Cn.close и новый цикл.

Изначально структура хранения данных прошлых периодов была мною задумана в отдельных файлах что бы не раздувать и не чистить базу Access. Данныеуспешно копились, и Теперь остро стоит вопрос собирать отчеты за год или 2-3.

Возможно я придумал не лучший способ но все работает заисключением описанной выше проблемы.

Не открывал исходники года два, какой курсор если не трудно напишите пожалуйста конкретно, ели нет буду читать и вспоминать все снова. )))
Спасибо.
...
Рейтинг: 0 / 0
30.03.2010, 18:17
    #36551293
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Execute() не вернет управление до тех пор пока сервер не закончит обрабатывать команду (не важно успешно или с ошибкой).
У тебя там явно два коннекта, Ca и Mconn - не надо такое делать. Одного-единственного коннекта хватает для 99.(9)% задач. И уж явно хватит для описаной.
...
Рейтинг: 0 / 0
30.03.2010, 18:22
    #36551309
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13какой курсор если не трудно напишите пожалуйста конкретно, ели нет буду читать и вспоминать все снова. )))

adUseServer
...
Рейтинг: 0 / 0
30.03.2010, 18:25
    #36551313
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Спасибо буду копать, результат напишу.
Но как можно скопирвать таблицу из одной базы mdb в другую при помощи одного коннекта?
...
Рейтинг: 0 / 0
30.03.2010, 18:26
    #36551319
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13Спасибо буду копать, результат напишу.
Но как можно скопирвать таблицу из одной базы mdb в другую при помощи одного коннекта?

Так вы же это и делаете с помощью одного коннекта:
Код: plaintext
INSERT INTO arh_rep IN'" + App.Path + "\Data\kvartplata.amd' SELECT 
...
Рейтинг: 0 / 0
30.03.2010, 18:28
    #36551325
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13Но как можно скопирвать таблицу из одной базы mdb в другую при помощи одного коннекта?

Есть еще один интересный способ, но он годится, если файлы постоянные и в одних и тех же местах. Я тоже когда-то разбивал базу на несколько файлов, а данные шарил через связанные таблицы . То есть добавлял к файлу связанную таблицу из другого файла и работал с ней, как с локальной.
...
Рейтинг: 0 / 0
30.03.2010, 18:29
    #36551327
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Точно прошу прщения, спасибо.
...
Рейтинг: 0 / 0
30.03.2010, 18:31
    #36551330
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13Один конэкт "Ca" в цикле переберает кучу архивных баз т.е. Cn.Open Execute(копирует нужные данные во временную таблицу всегда открытую при помощи Mconn) потом Cn.close и новый цикл.В какую такую временную таблицу? Или у тебя не ADO, или у тебя волшебные временные таблицы.
Настоящие временные таблицы (или данные в них) живут только на период сессии, потом автоматически умирают. Передавать их данные между двумя разными сессиями в принципе невозможно. Иначе это уже не временные таблицы, а вполне себе стандартные.

Andrey13Изначально структура хранения данных прошлых периодов была мною задумана в отдельных файлах что бы не раздувать и не чистить базу Access. Данныеуспешно копились, и Теперь остро стоит вопрос собирать отчеты за год или 2-3.Вариантов работы с сегментированием данных два:
1) Делать все на клиенте. Клиент по очереди подключается ко всем сегментам, вытаскивает из них полусырые данные, копирует их в свои собственные массивы, потом строит итоговый отчет на основе массивов. В плюсах - полный контроль, в минусах - много работы на клиенте.
2) В базе содержащей текущий сегмент делаются прокси таблицы указывающие на сегменты со старыми данными. Клиент соответсвенно всегда работает только с одной базой и обращается к старым через прокси.
2а) Делаешь представление охватывающее все таблицы (одну реальную и все прокси) получаешь виртуальную таблицу с полной историей.
Ни один из вариантов не требует нескольких коннектов.
...
Рейтинг: 0 / 0
30.03.2010, 18:51
    #36551385
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Код: plaintext
В какую такую временную таблицу?
Есть основная база, в ней таблица "arh_rep" она постоянная но данные в ней временные.
Каждый раз когда необходимо собрать отчет я планирую в эту "Временную" таблицу собирать данные из скажем 12 архивных баз со схожей структурой предварительно удаляя все старые данные из "arh_rep".
потом на основании "arh_rep" собираю отчет и больше она мне не нужна пока не дается команда на сбор нового отчета.
Да таблица постоянная данные временные.

если можно то подробнее что такое прокси таблицы и как их делать?
...
Рейтинг: 0 / 0
30.03.2010, 18:53
    #36551391
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13если можно то подробнее что такое прокси таблицы и как их делать?

Если я правильно понял, это как раз связанные таблицы, про которые я говорил.
Новая таблица => Связь с таблицами
...
Рейтинг: 0 / 0
30.03.2010, 18:58
    #36551408
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
White Owl2а) Делаешь представление охватывающее все таблицы (одну реальную и все прокси)

Наверное вообще можно сделать представление типа
Код: plaintext
1.
2.
3.
4.
5.
6.
select * from .... in 'FileName1'
union all
select * from .... in 'FileName2'
union all
select * from .... in 'FileName3'
union all
select * from .... in 'FileName4'
...
Рейтинг: 0 / 0
30.03.2010, 18:59
    #36551410
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Можно ли программно из VB создать таблицу связанную с другой базой MDB, т.е. как? В access просто "создать таблицу" "связь с таблицами" а программно не умею. Возможно для меня это будет вариант.
...
Рейтинг: 0 / 0
30.03.2010, 19:02
    #36551422
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Большое спасибо, буду работать.
только что делает "union all" для меня пока загадка.
...
Рейтинг: 0 / 0
30.03.2010, 19:04
    #36551427
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13Большое спасибо, буду работать.
только что делает "union all" для меня пока загадка.

Попробуйте F1...


UNION "склеивает" две таблицы в одну. То есть создав представление ("запрос" по аксессовскому), вы сможете работать с двумя таблицами (даже находящимися в разных файлах), как будто это одна таблица. Только набор полей должен быть абсолютно одинаковым
...
Рейтинг: 0 / 0
30.03.2010, 20:56
    #36551581
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13
Код: plaintext
В какую такую временную таблицу?
Есть основная база, в ней таблица "arh_rep" она постоянная но данные в ней временные.Тогда не надо называть ее "временной". Называй ее лучше "вспомогательной". Временные таблицы это специальный тип таблиц с ограниченым сроком жизни.

Andrey13если можно то подробнее что такое прокси таблицы и как их делать?У тебя Access? Тогда "связаные" или "linked".
...
Рейтинг: 0 / 0
30.03.2010, 21:04
    #36551591
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Shocker.ProWhite Owl2а) Делаешь представление охватывающее все таблицы (одну реальную и все прокси)

Наверное вообще можно сделать представление типа
Код: plaintext
1.
2.
3.
4.
5.
6.
select * from .... in 'FileName1'
union all
select * from .... in 'FileName2'
union all
select * from .... in 'FileName3'
union all
select * from .... in 'FileName4'
Да можно.
Можно вообще сделать например так: Оставить сегментированые базы как есть. Добавить к ним "объединяющую" базу которая будет состоять целиком из прокси-таблиц и представлений объединяющих эти прокси в общие таблицы. Получится что для работы внутри сегмента данных надо будет подключяться к базе содержащей соотвествующий сегмент. А для работы с несколькими сегментами разом просто переключить клиента на объединяющую базу.

Хотя по хорошему, уходить надо с Access на нормальные базы данных способные работать с большими объемами. Многие из них и сами умеют делать прозрачное сегментирование, да еще и на разные физические устройства при нужде.
...
Рейтинг: 0 / 0
30.03.2010, 23:37
    #36551722
AndrF
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
White OwlExecute() не вернет управление до тех пор пока сервер не закончит обрабатывать команду (не важно успешно или с ошибкой).

Если у Exxecute указать что он выполняется асинхронно, то управление вернет как миленький...
...
Рейтинг: 0 / 0
30.03.2010, 23:42
    #36551730
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
AndrFWhite OwlExecute() не вернет управление до тех пор пока сервер не закончит обрабатывать команду (не важно успешно или с ошибкой).Если у Exxecute указать что он выполняется асинхронно, то управление вернет как миленький...В данном случае, это к делу не относится.
...
Рейтинг: 0 / 0
31.03.2010, 21:21
    #36554040
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Спасибо всем за советы но проблема остаеться.


код тот жэ что приводил раньше.

Снова склоняюсь к мнению что
Код: plaintext
1.
ИМХО
Пока срабатывет Ca.Execute rsLg.Open забирает данные с пустой таблицы предврительно очищенной при помощи Mconn.Execute ("DELETE arh_rep.* FROM arh_rep")
После копирования данных из других баз таблица 'arh_rep'
содержит 13 записей(проверяю открывая в access.

запрос
Код: plaintext
rsLg.Open ("SELECT Year([arh_rep]![DataR]) as ГОД, Month([arh_rep]![DataR]) as Месяц, arh_rep.NameKat AS Категория, arh_rep.KodN AS Код, arh_rep.NameN AS Начисление, arh_rep.ObPl AS Площадь, arh_rep.Propis AS Прописано, arh_rep.Tarif AS [Тариф(осн)], arh_rep.TarifI AS [Тариф(доп)], arh_rep.Shc_new AS Счетчик, IIf([arh_rep]![Tip]='+',[arh_rep]![SummaI],0) AS Начислено, IIf([arh_rep]![Tip]='-',[arh_rep]![SummaI],0) AS Оплачено, IIf([arh_rep]![Tip]='s',[arh_rep]![SummaI],0) AS Субсидии FROM arh_rep ORDER BY arh_rep.DataR"), Mconn
в грид выдает только 12. Пропадает 1.

указл
Код: plaintext
adOpenKeyset, adLockOptimistic
работает стабильней.
rsLg.RecordCount дает 13.
В гридпопадает все. НО остался осадок, вдруг при работе на рабочихбазах будет сбоить т.е. терять строки, это будет очень, очень плохо.

Может кэширование диска отключить, я уже не знаю что делать.

Если есть мысли рад любому совету.
Спасибо.
...
Рейтинг: 0 / 0
31.03.2010, 21:48
    #36554075
Andrey13
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Можо ли при выполнении

Код: plaintext
Ca.Execute ("INSERT INTO arh_rep IN'" + App.Path + "\Data\kvartplata.amd' SELECT Adding.* FROM Adding WHERE (((Adding.KodKv)=" + Номер + "));")

подсчитать сколько строк добавлено? тогда мог хотя бы сделать проверку по количеству записей?
...
Рейтинг: 0 / 0
31.03.2010, 23:20
    #36554177
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13Спасибо всем за советы но проблема остаеться.

Так вы же ими не воспользовались
а) Один коннекшн
б) Серверный курсор

какой смысл советовать дальше?
...
Рейтинг: 0 / 0
31.03.2010, 23:57
    #36554205
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13Спасибо всем за советы но проблема остаеться.
код тот жэ что приводил раньше.Ну так! Естественно, проблема останется если код не изменять.


Andrey13Снова склоняюсь к мнению что
Код: plaintext
1.
ИМХО
Пока срабатывет Ca.Execute rsLg.Open забирает данные с пустой таблицы предврительно очищенной при помощи Mconn.Execute ("DELETE arh_rep.* FROM arh_rep")
После копирования данных из других баз таблица 'arh_rep'
содержит 13 записей(проверяю открывая в access. И к какому же мнению ты склоняешься?

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


Andrey13Может кэширование диска отключить, я уже не знаю что делать.Использовать один коннект и прокси таблицы.
...
Рейтинг: 0 / 0
31.03.2010, 23:59
    #36554212
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
ADO - Как убедиться что Execute отработал
Andrey13Можо ли при выполнении

Код: plaintext
Ca.Execute ("INSERT INTO arh_rep IN'" + App.Path + "\Data\kvartplata.amd' SELECT Adding.* FROM Adding WHERE (((Adding.KodKv)=" + Номер + "));")

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


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