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

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

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

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

в зависимости от т ого , что надо
...
Рейтинг: 0 / 0
31.07.2012, 13:05
    #37898952
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
Alex_menЛогика примерно такая есть 3 таблицы:
первая таблица справочная содержит набор записей на основании части которых(отобранной по определенному критерию) будет сделан отбор данных во внешней таблице и вот этот то набор и хотелось бы впихнуть сразу в конечную таблицу без цикла. Единственное получается что при добавлении набор данных отобранный во внешней таблице должен быть расширен на одно поле (имя пользователя который это делает). Возможно ли это сделать без цикла?
можно сериализовать эти отобранные записи в xml и уже его отправить на сервер в ХП для вставки
...
Рейтинг: 0 / 0
31.07.2012, 13:14
    #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
31.07.2012, 13:16
    #37898981
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
так оберните свой вызов на сервере в ХП и вызывайте её с нужными вам параметрами. на сервере и линковать можно другие серверы/базы
...
Рейтинг: 0 / 0
31.07.2012, 13:58
    #37899074
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
qwerty112Alex_menЛогика примерно такая есть 3 таблицы:
первая таблица справочная содержит набор записей на основании части которых(отобранной по определенному критерию) будет сделан отбор данных во внешней таблице и вот этот то набор и хотелось бы впихнуть сразу в конечную таблицу без цикла. Единственное получается что при добавлении набор данных отобранный во внешней таблице должен быть расширен на одно поле (имя пользователя который это делает). Возможно ли это сделать без цикла?
можно сериализовать эти отобранные записи в xml и уже его отправить на сервер в ХП для вставки

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

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

как бе собрать рекордсет и updatebatch . В чем проблема то?
...
Рейтинг: 0 / 0
31.07.2012, 14:37
    #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
31.07.2012, 14:40
    #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
31.07.2012, 14:41
    #37899156
Konst_One
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
код абсурдный, происходит добавление записи из текущей, зачем?
...
Рейтинг: 0 / 0
31.07.2012, 15:12
    #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
31.07.2012, 15:13
    #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
31.07.2012, 15:16
    #37899220
QValD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
в цикле не забудь переходить на след запись
Код: vbnet
1.
rst.movenext
...
Рейтинг: 0 / 0
31.07.2012, 15:16
    #37899221
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
Почитай любую книжку по основам языка SQL, ты удивишься, как вместо двух экранов кода на бэйсике, ты сможешь написать одну строку на SQL.
...
Рейтинг: 0 / 0
31.07.2012, 15:48
    #37899273
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
Shocker.Pro,

как раз пошел на курсы
...
Рейтинг: 0 / 0
31.07.2012, 15:52
    #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
31.07.2012, 16:05
    #37899294
qwerty112
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
Alex_menqwerty112пропущено...

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

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

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

хм попробую этот вариант тоже разобрать, спасибо
...
Рейтинг: 0 / 0
31.07.2012, 16:38
    #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
31.07.2012, 16:57
    #37899377
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
QValDЧуешь разницу между нагрузкой на сервер бд и нагрузкой на сервер приложений?
Одно дело в цикле выполнить тыщу запросов и совсем другое - выбрать данные, собрать(циклом на стороне сервера приложений) и одним запросом вставить.особенно по сети через модем.
...
Рейтинг: 0 / 0
02.04.2013, 18:48
    #38209854
Alex_men
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вставка набора записей.
Konst_One,

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

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

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


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