Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выполнить запрос из внешнего приложения / 13 сообщений из 13, страница 1 из 1
15.10.2015, 14:57
    #39077725
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
Привет всем!
Пишу приложение на Vb, из него надо выполнить сохраненный запрос вида Insert into ... Select

Запрос обновляет таблицу со сложным ключом и вставляет только несовпадающие записи. Если выполнять его из интерфеса Access - он ругается на то, что ошибка вставки, дескать, не все данные будут вставлены и прочая, но тем не менее в итоге данные вставляет.
Если же пытаться выполнитье го из внешнего приложения (через adodb.connection.execute, получаю просто номер ошибки, данные не добавляются).
Подскажите, пожалуйста, где копать, чтобы все-таки вставить данные?
...
Рейтинг: 0 / 0
15.10.2015, 15:12
    #39077743
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
fundddЗапрос обновляет таблицу со сложным ключом и вставляет только несовпадающие записи.
Ну так откорректируйте запрос так, чтобы записи, вызывающие ошибку дублирования ключа, отсеивались секцией отбора.
...
Рейтинг: 0 / 0
16.10.2015, 06:05
    #39078192
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
Э нет :)
В этом как раз таки и есть фишка этого запроса.
...
Рейтинг: 0 / 0
16.10.2015, 06:36
    #39078201
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
fundddЭ нет :)
В этом как раз таки и есть фишка этого запроса.
Фишка в вашем не правильном запросе?
Жесть.
...
Рейтинг: 0 / 0
16.10.2015, 06:43
    #39078204
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
А с чего вы взяли, что он неправильный?
Обычное дело - запрос на обновление (записать в таблицу A записи из таблицы B, в таблице A отсутствующие).
NOT IN слишком ресурсоемкий метод.

Впрочем, я не настаиваю. Подскажите, какой запрос будет более праивльный?
...
Рейтинг: 0 / 0
16.10.2015, 07:22
    #39078219
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
fundddА с чего вы взяли, что он неправильный?
Обычное дело - запрос на обновление (записать в таблицу A записи из таблицы B, в таблице A отсутствующие).
NOT IN слишком ресурсоемкий метод.

Впрочем, я не настаиваю. Подскажите, какой запрос будет более праивльный?
Вы придумали сложный ключ.
Мы о нем ничего не знаем.
Мы даже не знаем схему вашей судя по всему псевдобазы.
>>Обычное дело - запрос на обновление (записать в таблицу A записи из таблицы B, в таблице A отсутствующие)
Впечетлило.
...
Рейтинг: 0 / 0
16.10.2015, 07:30
    #39078224
ROI
ROI
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
fundddОбычное дело - запрос на обновление (записать в таблицу A записи из таблицы B, в таблице A отсутствующие).
Обычное дело-житейское.
Чё в форум писать.
Оно же "обычное".
...
Рейтинг: 0 / 0
16.10.2015, 09:12
    #39078272
Akina
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
fundddЕсли выполнять его из интерфеса Access - он ругается на то, что ошибка вставки, дескать, не все данные будут вставлены и прочая, но тем не менее в итоге данные вставляет.
Если же пытаться выполнитье го из внешнего приложения (через adodb.connection.execute, получаю просто номер ошибки, данные не добавляются).
Угу. Аксесс - не только БД, но и интерфейс. И может себе позволить вставку по одной записи. ADODB - нет.

fundddгде копать, чтобы все-таки вставить данные?
Вариантов несколько.
Первый вариант - это сохранение данных во временную таблицу, и затем вставка из неё только уников. Вряд ли выиграете по времени, но точно выиграете по ресурсам.
Второй - отказаться от ADO и порулить Access.Application.
Третий (и самый имхо правильный) - всё-таки переделать запрос. А чтобы WHERE NOT IN не создавало избыточной нагрузки - убрать по возможности отсев дублей в основной селект частными условиями.
Можно понапридумывать и ещё вариантов - только лень дурь генерить.
...
Рейтинг: 0 / 0
16.10.2015, 11:41
    #39078430
Выполнить запрос из внешнего приложения
Давайте с начала. У вас приложение на Vb, использующее MDB/AccDB в качестве хранилища?
Таблица-источник и таблица-получатель находятся в одном файле?
Как выглядит сложный ключ? Это одно поле или несколько?
Классическое решение ("Записи без подчиненных") для Jet:
Код: plsql
1.
...FROM [Источник] LEFT JOIN [Приемник] ON [Источник].[Ключ]=[Приемник].[Ключ] WHERE [Приемник].[Ключ] Is Null


Другой вариант (если NOT IN слишком ресурсоемкий) использовать Not EXISTS.
...
Рейтинг: 0 / 0
16.10.2015, 16:05
    #39078754
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
Анатолий, Акина, спасибо!

Вариант Анатолия очень изящный, его и возьму на вооружение, спасибо еще раз!
Рой, нам грубиянов не надо. Мы и сами грубияны.
...
Рейтинг: 0 / 0
18.10.2015, 09:47
    #39079265
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
fundddЗапрос обновляет таблицу со сложным ключом и вставляет только несовпадающие записи.

Зло скорее всего тут : со сложным ключом

Если этот ключ так дорог (без подагры уже никак, привычка) - можно его и оставить...
1. На стороне, которая генерирует записи добавляем поле счетчик.
2. На стороне, которая принимает записи добавляем поле длинное целое (для хранения зн. счетчика из п.1).
Каждый раз импортируем только те записи, значения счетчика которых в генераторе больше максимального длинного целого в приемнике на момент импорта.

Есть конечно нюансы:
- ничего не известно по генератор (возможно для него сделать счетчик не судьба и нужны надстройки на том же vb)
- если генератор не один, нужно добавлять еще и в приемник и в генераторы поле признака генератора...
...
Рейтинг: 0 / 0
18.10.2015, 10:38
    #39079269
vmag
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
fundddОбычное дело - запрос на обновление (записать в таблицу A записи из таблицы B, в таблице A отсутствующие).

Согласен, за исключением - того, что запрос на добавление...
...
Рейтинг: 0 / 0
19.10.2015, 09:49
    #39079759
funddd
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выполнить запрос из внешнего приложения
Конечно.

Всем спасибо, уже реализовал
Код: sql
1.
...FROM [Источник] LEFT JOIN [Приемник] ON [Источник].[Ключ]=[Приемник].[Ключ] WHERE [Приемник].[Ключ] Is Null
...
Рейтинг: 0 / 0
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Выполнить запрос из внешнего приложения / 13 сообщений из 13, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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