1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
1

Запись ADO recordset в прилинкованную таблицу

13.01.2017, 08:49. Показов 5400. Ответов 28
Метки нет (Все метки)

Подскажите, пожалуйста, имеются ли методы записи ADO recordset в прилинкованную таблицу методом insert to, а не цикличным перебором строк recordset и записи каждой строки в таблицу. Например:
Visual Basic
1
2
3
4
5
6
7
8
9
Dim rsADO As Adodb.Recordset
Set rsADO = New ADODB.Recordset
rsADO.Open SQL_запрос,Conn, и т.д.
 
' Сейчас запись в прилинкованную таблицу идёт через цикличный перебор
 Do while not rsADO.EOF
    CurrentDB.Execute "Insert into" ....
 rsADO.MoveNext
loop
Вот возможно ли как-то без цикла сразу записывать в таблицу конструкцией insert to. Пробовал писать такую конструкцию, но запрос rsADO не воспринимается как источник данных
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2017, 08:49
Ответы с готовыми решениями:

ADO.Recordset - Как узнать, что запись уже редактируется
Если многопользовательский вариант при доступе ADO.Recordset как узнать что запись кем то...

ADO Recordset и временные таблицы
ADO.RecordSet не хочет работать с временными таблицами. Есть запрос: CREATE TABLE #EntsLeav...

Операторы IN и CASE в Recordset (ADO)
Я использую оператор IN в свойстве Filter объекта Recordset (ADO) и оператор CASE ... WHEN ... THEN...

Ускорение поиска в ADO recordset
Здравствуйте! Ситуация следующая - имеется локальна база с таблицей клиентов, на SQL Server имеется...

28
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 09:09 2
Так вообще непонятно, зачем вы делаете этот циклиеский перебор, и зачем открываете рекодсет.

Сами же и придумали все эти лишние действия.

Уберите все, кроме CurrentDB.Execute "Insert into" ....

Добавлено через 4 минуты
Цитата Сообщение от Silmaril Посмотреть сообщение
Пробовал писать такую конструкцию, но запрос rsADO не воспринимается как источник данных
Текст запроса "Insert into" .... в студию. Думаю, там ошибка

Добавлено через 2 минуты
Должно быть что-то вроде
SQL
1
2
INSERT INTO ИмяТаблицыКуда (Поле, поле, ..., поле)
SELECT (ваш SQL_запрос, который вы зачем-то открывали в рекордсете)
0
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
13.01.2017, 09:14  [ТС] 3
У меня почему-то не получается сообразить как его сделать. Делаю следующее:

Visual Basic
1
2
3
CurrentDb.execute "Insert Into " - указываю прилинкованную таблицу с полями
"Select " - тут перечисляю поля ADO recordset
"From " & rsADO - вот тут дебаггер выдаёт сообщение type mismatch
Добавлено через 1 минуту
SQL делается к другой базе, да и совершенно к другому серверу на Oracle, я его не смогу так указать в запросе
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 09:15 4
Silmaril, Забудьте про rsADO. Нет такого объекта в ваей прогамме. Пишите просто текст запроса.
0
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
13.01.2017, 09:16  [ТС] 5
Как так?! Это же запрос к оракловой базе, иначе разве можно как-то?!
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 09:26 6
Цитата Сообщение от Silmaril Посмотреть сообщение
SQL делается к другой базе, да и совершенно к другому серверу на Oracle, я его не смогу так указать в запросе
Серьезно? А когда открывали рекордсет - смогли как-то.

Читайте синтаксис
SQL
1
FROM ИмяТаблицы IN СсылкаНаВнешююБазу
Добавлено через 2 минуты
В любом случае - открытый рекордсет - это переменная в памяти компьютера, а не объект базы данных. Из переменной нельзя сделать From. В принципе нельзя.

Добавлено через 5 минут
Какую альтернативу можно педложить, если ссылка на базу оракл в тексте запроса не получитя:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Dim rsADO As Adodb.Recordset, rsGoal As Adodb.Recordset
Set rsADO = New ADODB.Recordset
rsADO.Open SQL_запрос,Conn, и т.д.
Set rsGoal = New ADODB.Recordset
rsGoal.Open ИмяТаблицыКуда, Conn, и т.д.
 
While not rsADO.EOF
    rsGoal.AddNew
    rsGoal.ИмяПоля = rsADO.ИмяПоля
    rsGoal.ИмяПоля = rsADO.ИмяПоля
....
    rsGoal.ИмяПоля = rsADO.ИмяПоля
    rsADO.MoveNext
wend
rsGoal.UpdateBatch
Добавлено через 59 секунд
В некоторых случаях метод .UpdateBatch не работает (если честно, я по хелпу по ADO так и не поняла, в каких именно (похоже, зависит от особенностей конкретного сервера), посто запомнила сам факт, что может и не работать) - тогда нужно делать rsGoal.Update в каждом цикле. Но на MS SQL Server .UppendAll работал нормально.

 Комментарий модератора 
Сообщение отредактировано по просьбе texnik-san.
0
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
13.01.2017, 09:26  [ТС] 7
Да вроде понятно, что это переменная, хотя и содержит все необходимы данные. Есть же удобная штука выгрузки recordset CopeFromRecordset в Excel. Надо покапать тогда в сторону From IN, хотя, если честно, то слабо представляю себе, как можно указать там параметры подключения
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 09:30 8
Цитата Сообщение от Silmaril Посмотреть сообщение
слабо представляю себе, как можно указать там параметры подключения
Не помню подробностей, но очень, очень близко к тому, как они указываются в строке подключения.

Добавлено через 39 секунд
Кстати, целевая-то таблица находится ГДЕ? В аксес?
0
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
13.01.2017, 09:32  [ТС] 9
А разница в скорости, кстати будет отличаться, что через цикл, через ваш альтернативный вариант и через FROM IN. Собственно вопрос в скорости?
Таблица на SQL сервере, в аксес линк на эту таблицу
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 09:47 10
У меня недостаточно опыта, чтобы ответить наверняка,

но закралось подозрение, что запрос через FROM IN в данном конкретном случае будет самым медленным, а вариант с UpdateAll - самым быстрым. Потому что запрос с FROM IN выполнять будет аксес.

А в варианте UpdateAll - рекордсет оракла будет открывать оракл, а таблицу SQL сервера - SQL сервер (если обращаться к ней не как к линкованной)
1
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
13.01.2017, 09:49  [ТС] 11
Спасибо большое! Попробую сейчас реализовать
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 09:49 12
А вообще, задайте вопрос в разделе SQL сервер - неужели нет способа напрямую подключиться к ораклу, минуя аксес?
0
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
13.01.2017, 09:58  [ТС] 13
Графическая оболочка access, данный анализ данных подразумевается проводиться пользователем, поэтому не получится access миновать
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 10:37 14
Я имела в виду - для данного конкретного действия по перекачке данных из оракла на SQL Server. Скажем, создать на SQL Server хранимку, которая будет брать данные из оракла. А из аксес только передавать хранимке параметры (какие именно данные сейчас понадобились).
0
Мы один, давай на "ты"
2872 / 1149 / 281
Регистрация: 16.06.2016
Сообщений: 2,614
13.01.2017, 10:54 15
texnik-san, позвольте спросить в целях повышения образованности - а кто такой будет этот... ©
Цитата Сообщение от texnik-san Посмотреть сообщение
метод .UppendAll
1
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 11:17 16
Ой.. сори... Боже, как вредно начинать отвечать на форуме, толком не проснувшись... Пошу пощения у всх, Silmaril, у вас тоже.

UpdateBatch я имела в виду, конечно же!

http://www.w3schools.com/asp/m... ebatch.asp

Добавлено через 38 секунд
Панург, большое спасибо, что ткнули!
0
1 / 1 / 0
Регистрация: 29.04.2015
Сообщений: 88
13.01.2017, 11:19  [ТС] 17
Да ничего страшного у меня аксес сразу ругнулся на это Попробовал вашим алтернативным методом, в результате запись в прилинкованную таблицу происходит дольше, нежели чем CurrentDB.Execute "Insert into...."
Всё-таки беда в том, что слишком долго происходит перебор рекордсета в цикле, вот я и подумал, что можно было бы как-то одним запросом перекинуть без цикла, но что-то нигде такого решения не нахожу
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 11:24 18
Вот еще ссылка на пример использования этого же метода (это к вопросу, "что за")

Visual Basic
1
2
3
4
5
6
7
Do Until rstTitles.EOF
    If Trim(rstTitles!Type) = "self_help" Then
        rstTitles!Type = "psychology"
    End If
    rstTitles.MoveNext
Loop
rstTitles.UpdateBatch
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 11:38 19
Silmaril, а я вот еще о каком варианте подумала:

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

В запросе выбрать ваш рекордсет, сохранить.

А дальше имя, под которым вы сохранили запрос, как раз и использовать в качестве From для Insert без цикла.
Миниатюры
Запись ADO recordset в прилинкованную таблицу  
0
шапоклякистка 8-го дня
3672 / 2232 / 391
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.01.2017, 11:50 20
А дальше у меня сработал такой трюк:

Я создала обычный запрос на выборку, скопировала в него текст запроса к серверу,

а после имени таблицы в From добавила

SQL
1
IN "" [А сюда скопировала полностью все содержимое свойства "строка подключения ODBC" из запроса к северу]
Добавлено через 55 секунд
(Пустые кавыки после IN нужны, без них не работает).

Добавлено через 1 минуту
Это если нужно, чтобы запроса к серверу не было в списке объектов и нельзя было посмотреть там имя пользователя-пароль.

Добавлено через 1 минуту
Хотя вот сравниваю - и запрос к серверу работает все-таки быстрее, чем from...in (ну и логично, запрос к сервеу выполняет сервер).
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.01.2017, 11:50
Помогаю со студенческими работами здесь

ADO recordset фильтр по нескольким полям
Здравствуйте. Помогите пожалуйста разобраться. На форме есть несколько полей, по значению которых...

как узнать что recordset открыт (v ADO)
Kak mozhno usnat shto recordset otkrit ili sakrit (v ADO). Inogda bivaet shto v bolshom proekte...

Относительно темы "Ускорение поиска в ADO recordset"
Считаю, что модераторы поспешили закрыть тему "Ускорение поиска в ADO recordset". У человека есть...

Передать в recordset результат SQL на основе другого recordset
Начнём с того, что пытаюсь я эту штуку сделать в Excel на ADODB. Поэтому раздел форума должен быть...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru