powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вставка набора записей.
25 сообщений из 45, страница 1 из 2
Вставка набора записей.
    #37898926
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день, Уважаемые форумчане!

Вопрос скорее для расширения кругозора, поэтому прошу не отсылать фразами "такие вещи надо делать хранимками на стороне сервера"

Подскажите как можно в коде VB сделать групповую вставку данных. Т.е. мне нужно вставить не одну запись с набором полей p1,p2,p3,p4, а произвольное количество от 1 до N записей отобранных во внешнем источнике.

Логика примерно такая есть 3 таблицы:
первая таблица справочная содержит набор записей на основании части которых(отобранной по определенному критерию) будет сделан отбор данных во внешней таблице и вот этот то набор и хотелось бы впихнуть сразу в конечную таблицу без цикла. Единственное получается что при добавлении набор данных отобранный во внешней таблице должен быть расширен на одно поле (имя пользователя который это делает). Возможно ли это сделать без цикла?
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37898936
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
на сервере делай с помощью инструкции UPDATE ... FROM ...
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37898939
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или INSERT INTO ... SELECT ...

в зависимости от т ого , что надо
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37898952
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_menЛогика примерно такая есть 3 таблицы:
первая таблица справочная содержит набор записей на основании части которых(отобранной по определенному критерию) будет сделан отбор данных во внешней таблице и вот этот то набор и хотелось бы впихнуть сразу в конечную таблицу без цикла. Единственное получается что при добавлении набор данных отобранный во внешней таблице должен быть расширен на одно поле (имя пользователя который это делает). Возможно ли это сделать без цикла?
можно сериализовать эти отобранные записи в xml и уже его отправить на сервер в ХП для вставки
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37898975
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_Oneили INSERT INTO ... SELECT ...

в зависимости от т ого , что надо

Я так пробовал делать пока не наткнулся на такую фишку: один и тот же код работает на ХР и начисто отказывается на семерке. А потом мне получается надо сделать вложенные запросы к разным базам. для пояснения:

пусть Т1 - справочная
Т2 внешняя
Т3 конечная таблица

тогда моя конструкция должна быть примерно такой

cn_base.Execute "SELECT * INTO T3 " & _
"FROM OPENROWSET ('Data source=...','SELECT * FROM T2 WHERE t2.pn in (SELECT P2 FROM T1 Where p1=<критерий> )') "

я честно говоря не уверен в ее работоспособности и конструкция 'Data source=...' видимо зависит от операционки как я уже писал выше.
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37898981
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так оберните свой вызов на сервере в ХП и вызывайте её с нужными вам параметрами. на сервере и линковать можно другие серверы/базы
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899074
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112Alex_menЛогика примерно такая есть 3 таблицы:
первая таблица справочная содержит набор записей на основании части которых(отобранной по определенному критерию) будет сделан отбор данных во внешней таблице и вот этот то набор и хотелось бы впихнуть сразу в конечную таблицу без цикла. Единственное получается что при добавлении набор данных отобранный во внешней таблице должен быть расширен на одно поле (имя пользователя который это делает). Возможно ли это сделать без цикла?
можно сериализовать эти отобранные записи в xml и уже его отправить на сервер в ХП для вставки

Этотна мой взгляд излишнее усложнение, лишний так сказать посредник
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899084
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

Да про хранимки то я понял, мне интересно можно ли такое кодом реализовать. Я же говорю интерес чисто теоретический. Понятно что это будет медленнее чем хранимая процедура. Интересно саму возможность исследовать понять и разобрать по винтикам.
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899089
QValD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men,

как бе собрать рекордсет и updatebatch . В чем проблема то?
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899148
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
QValDAlex_men,

как бе собрать рекордсет и updatebatch . В чем проблема то?

Тут у меня пробельчик в знаниях который и хочу восполнить. До конца не понимаю как работает batch. Сейчас параллельно сижу читаю и ставлю опыты.

Покамест у меня есть некий рекордсет RST. я пишу такой код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rst.Open "SELECT * FROM T3 ", _
                    CnBase, adOpenDynamic, adLockBatchOptimistic
    
                    rst.AddNew: rst("P1") = rst!P1 '(из Т2)
                                     rst("P2") = rst!P2 '(из Т2)
                                     rst("P2") = "User"
                                   
    
                    rst.UpdateBatch (adAffectAll)
                    
                    rst.Close
                    Set rst = Nothing



У меня добавляется только одна запись, соответственно первая в рекордсете. Где я ошибаюсь?
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899154
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
1.
2.
3.
                    rst.AddNew: rst("P1") = rst!P1 '(из Т2)
                                     rst("P2") = rst!P2 '(из Т2)
                                     rst("P2") = "User"




это и есть твоя одна запись, больше ничего не добавляется. задача то какая? что такое P2 из T2 ?
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899156
Фотография Konst_One
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
код абсурдный, происходит добавление записи из текущей, зачем?
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899216
QValD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menQValDAlex_men,

как бе собрать рекордсет и updatebatch . В чем проблема то?

Тут у меня пробельчик в знаниях который и хочу восполнить. До конца не понимаю как работает batch. Сейчас параллельно сижу читаю и ставлю опыты.

Покамест у меня есть некий рекордсет RST. я пишу такой код
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
rst.Open "SELECT * FROM T3 ", _
                    CnBase, adOpenDynamic, adLockBatchOptimistic
    
                    rst.AddNew: rst("P1") = rst!P1 '(из Т2)
                                     rst("P2") = rst!P2 '(из Т2)
                                     rst("P2") = "User"
                                   
    
                    rst.UpdateBatch (adAffectAll)
                    
                    rst.Close
                    Set rst = Nothing



У меня добавляется только одна запись, соответственно первая в рекордсете. Где я ошибаюсь?

Заполняешь первый рекордсет

Код: vbnet
1.
2.
rst.Open "SELECT * FROM T3 ", _
                    CnBase, adOpenDynamic


Создаешь 2-й.
В цикле по первому заполняешь 2-й
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
do until rst.eof
   rs2.adnew 
   '.....
   rs2.update
loop

rs2.updatebatch
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899218
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One
Код: vbnet
1.
2.
3.
                    rst.AddNew: rst("P1") = rst!P1 '(из Т2)
                                     rst("P2") = rst!P2 '(из Т2)
                                     rst("P2") = "User"




это и есть твоя одна запись, больше ничего не добавляется. задача то какая? что такое P2 из T2 ?

Хорошо как мне в таблицу Т3 записать данные отобранного рекордсета плюс в дополнительном поле P3 таблици Т3 должно подставляться указанное мною значение "USER"?

Konst_Oneкод абсурдный, происходит добавление записи из текущей, зачем?


т.к. задачи которые решал раньше не требовали группового добавления/обновления записей, то и привык как то по одной. Сейчас скажем реши освоить что то новое, на будущее. А вот как наборами записей оперировать пока не освоился.
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899220
QValD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в цикле не забудь переходить на след запись
Код: vbnet
1.
rst.movenext
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899221
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почитай любую книжку по основам языка SQL, ты удивишься, как вместо двух экранов кода на бэйсике, ты сможешь написать одну строку на SQL.
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899273
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Shocker.Pro,

как раз пошел на курсы
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899276
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
QValDЗаполняешь первый рекордсет

Код: vbnet
1.
2.
rst.Open "SELECT * FROM T3 ", _
                    CnBase, adOpenDynamic


Создаешь 2-й.
В цикле по первому заполняешь 2-й
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
do until rst.eof
   rs2.adnew 
   '.....
   rs2.update
loop

rs2.updatebatch



Т.е. без цикла не сделать, ну тогда я примерно так и делал. Ну а для больших объемов хранимки...
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899294
qwerty112
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alex_menqwerty112пропущено...

можно сериализовать эти отобранные записи в xml и уже его отправить на сервер в ХП для вставки

Этотна мой взгляд излишнее усложнение, лишний так сказать посредник
сложность - кажущаяся,
xml-строку можно получить одним простым запросом + ADO.Recordset.getstring
(это если не брать во внимание стандартные АДО-варианты типа Save (.. adPersistXML))

а других вариантов - часто и нет ("перекачивание" из рекордсета в рекордсет - не обсуждается)
линкед сервер / OPENROWSET и прочая - требуют "не дохлых" прав, для начала (и должны быть на этом сервере разрешены, а сервер конечно, в Омерике :)) ),
даа, и плохо это в принципе - "зашитая" логика в клиенте ...
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899310
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
qwerty112,

хм попробую этот вариант тоже разобрать, спасибо
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899342
QValD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_menQValDЗаполняешь первый рекордсет

Код: vbnet
1.
2.
rst.Open "SELECT * FROM T3 ", _
                    CnBase, adOpenDynamic


Создаешь 2-й.
В цикле по первому заполняешь 2-й
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
do until rst.eof
   rs2.adnew 
   '.....
   rs2.update
loop

rs2.updatebatch



Т.е. без цикла не сделать, ну тогда я примерно так и делал. Ну а для больших объемов хранимки...
Чуешь разницу между нагрузкой на сервер бд и нагрузкой на сервер приложений?
Одно дело в цикле выполнить тыщу запросов и совсем другое - выбрать данные, собрать(циклом на стороне сервера приложений) и одним запросом вставить.
...
Рейтинг: 0 / 0
Вставка набора записей.
    #37899377
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
QValDЧуешь разницу между нагрузкой на сервер бд и нагрузкой на сервер приложений?
Одно дело в цикле выполнить тыщу запросов и совсем другое - выбрать данные, собрать(циклом на стороне сервера приложений) и одним запросом вставить.особенно по сети через модем.
...
Рейтинг: 0 / 0
Вставка набора записей.
    #38209854
Alex_men
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Konst_One,

а можно ли в инструкции
Код: vbnet
1.
 SELECT * INTO #table FROM OPENROWSET (......)

вместо прописывания строки подключения использовать открытый connection ?

Меня что то утомило то обстоятельство, что если открываю connection используя UDL файлы, то все работает как часы, если использую строку подключения (к томуже источнику данных в данном случае DBF) так он гад поработает месяц другой, а потом отвалится с ошибкой "источник данных не найден или не указан драйвер используемый по умолчанию". Сейчас уже второе пришествие данного бага, в прошлый раз помогло исправление параметра в реестре. Параметр остался на месте,машина моя для разработки.
...
Рейтинг: 0 / 0
Вставка набора записей.
    #38210323
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men, нет
OPENROWSET - это инструкция ядра БД
...
Рейтинг: 0 / 0
Вставка набора записей.
    #38210324
Фотография HandKot
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_men, Вы можете показать, как на данный момент у Вас это организовано?
...
Рейтинг: 0 / 0
25 сообщений из 45, страница 1 из 2
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Вставка набора записей.
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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