Скорость добавления в Access базу...

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Скорость добавления в Access базу...

Сообщение Gmp » 17.08.2006 (Чт) 14:32

Сейчас у меня данные добавляются в базу в цикле: читаем файл, парсим строку, добавляем в базу используя:

sSQL = "INSERT INTO Basa (col1, col2) VALUES (var1, var2);"
ConDB.Execute sSQL, , adCmdText

Можно ли ускорить процесс, добавив все сразу?
INSERT INTO TraceFiles (col1, col2) VALUES (var1, var2);
INSERT INTO TraceFiles (col1, col2) VALUES (var1, var2);
INSERT INTO TraceFiles (col1, col2) VALUES (var1, var2);
и т.д.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.08.2006 (Чт) 14:37

Можно.
Добавляй в рекордсет в режиме пакетного обновления (Recordset.AddNew) или из сохраненного запроса (ADODB.Command).
Lasciate ogni speranza, voi ch'entrate.

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 17.08.2006 (Чт) 15:18

alibek
Примерчик можно?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.08.2006 (Чт) 15:31

Код: Выделить всё
cn.CursorLocation = adUseClient
cn.Open
rs.Open "select * from Basa where 1=2", cn, adOpenStatic, adLockBatchoptimistic
For ...
    rs.AddNew
    rs!Col1 = Var1
    rs!Col2 = Var2
    ...
Next
rs.UpdateBatch
Лучший способ понять что-то самому — объяснить это другому.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.08.2006 (Чт) 15:32

Поищи по UpdateBatch или ADODB.Command.
Lasciate ogni speranza, voi ch'entrate.

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 17.08.2006 (Чт) 15:47

Antonariy
Так это ведь еще один цикл получу и большие тормоза. ;)

сейчас это работает так:

for i = 0 to ubound(aText)
...операции со строкой...
sSQL = "INSERT INTO Basa (col1, col2) VALUES (var1, var2);"
ConDB.Execute sSQL, , adCmdText
next i

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.08.2006 (Чт) 15:57

Нет. Рекордсет с клиентским курсором летает как птичка, это во-первых. Во-вторых, у тебя в цикле каждую итерацию происходит запрос к базе, это самая долгая часть итерации, а у меня всего два раза. В-третьих, откуда ты взял еще один цикл? Ну и в-четвертых, все это не раз проверено.
Лучший способ понять что-то самому — объяснить это другому.

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 17.08.2006 (Чт) 16:08

Antonariy
Ок спасибо сейчас буду пробовать :)

Gmp
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 68
Зарегистрирован: 22.07.2006 (Сб) 17:04
Откуда: Германия

Сообщение Gmp » 17.08.2006 (Чт) 18:03

Antonariy
В реальности оказалось медленней чем как я делал. :( Еще идеи есть?

Pantalone
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 687
Зарегистрирован: 12.11.2005 (Сб) 16:46
Откуда: Сапог

Сообщение Pantalone » 17.08.2006 (Чт) 19:07

Используй DAO, на добавлении порвет ADO в клочья.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 17.08.2006 (Чт) 19:57

Кажется, мой вопрос весьма близкий.

rs = "SELECT DISTINCT Title FROM tblPedagog"

получаю в DataGrid такую выборку, какая мне нужна.

Как сохранить ее в другой таблице?

rs = "INSERT INTO tblDub (Title) SELECT Title FROM... - откуда?

При попытке сохранить из tblPedagog теряется выборка.
Как сохранить выборку, полученную в DataGrid?

Спасибо!

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.08.2006 (Чт) 20:44

Gmp писал(а):Antonariy
В реальности оказалось медленней чем как я делал. :( Еще идеи есть?
А у тебя аксесс или mssql? На mssql пакет добавлялся быстрее. А с аксессом действительно, попробуй dao/
Summer.05, только такими же инсертами или копированием в рекордсет, полученный из другой таблицы. Еще можно извратиться, преобразовав рекодсет в xml, заменить таблицу-источник и добавить инструкцию на insert. Затем перегнать обратно в rs и проапдейтить.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 17.08.2006 (Чт) 21:18

Antonariy

Спасибо за ответ, но пока это для меня еще далеко не все понятно.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 17.08.2006 (Чт) 21:20

Чего непонятного? 1й и 2й способ подробно описаны выше, а заморочка с xml вряд ли побьет их по скорости, хотя и самая простая в исполнении. Короче, вот она:
Код: Выделить всё
Dim rs As New ADODB.Recordset
Dim cn As New ADODB.Connection
Dim xml As New MSXML2.DOMDocument
Dim s as String
    cn.CursorLocation = adUseClient
    cn.Open "driver={sql server};database=callcenter;server=(local)"
    rs.Open "select  * from tblSrc", cn, adOpenStatic, adLockBatchOptimistic
    rs.Save xml, adPersistXML
    s = Replace(xml.xml, "tblSrc", "tblTrgt")
    s = Replace(s, "<rs:data>", "<rs:data><rs:insert>")
    xml.xml = Replace(s, "</rs:data>", "</rs:insert></rs:data>")
    rs.Close
    rs.Open xml
    Set rs.ActiveConnection = cn
    rs.UpdateBatch
Естественно, набор полей обеих таблиц должен совпадать и поля выборки в tblTrgt не должны быть вычислимыми, типа identity.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 17.08.2006 (Чт) 22:02

Antonariy
О-о-о-оо Повелитель!
Огромное тебе спасибо!!!

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 17.08.2006 (Чт) 23:08

А счастье было так близко..


Dim rs As New ADODB.Recordset
Dim cn As New ADODB.Connection
Dim xml As New MSXML2.DOMDocument

Последовательно - ошибка: User-defined type not defined

база Access
Jet
Ado+DataGrid

Efiop
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 06.06.2006 (Вт) 12:14
Откуда: РК

Сообщение Efiop » 18.08.2006 (Пт) 7:14

Summer.05
получаю в DataGrid такую выборку, какая мне нужна.
Как сохранить ее в другой таблице?

запросом:
SELECT * INTO конечный_объект From Источник WHERE pole1='123'

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 8:39

Summer.05, подключи в референсах Microsoft XML 2.6 или выше.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 18.08.2006 (Пт) 9:48

Efiop писал(а):

SELECT * INTO конечный_объект From Источник WHERE pole1='123'


Спасибо, но источник - рекордсет. А из него выбрать нельзя.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 18.08.2006 (Пт) 10:11

Antonariy
Спасибо за наставничество!
теперь - новая напасть:

Can not assign to read-onlyproperty
для строки xml.xml=

Efiop
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 06.06.2006 (Вт) 12:14
Откуда: РК

Сообщение Efiop » 18.08.2006 (Пт) 10:36

Summer.05,
Спасибо, но источник - рекордсет. А из него выбрать нельзя.

Ты че прикалываешься, вставь этот запрос, туда куда ты вставлял свои запросы. Причем здесь рекордсет.
Как сохранить ее в другой таблице?

Так вот этим запросом и сохранишь свою выборку в другой таблице.
Источник..., а ты выборку от куда делаешь, разве не с базы?

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 10:52

Summer.05
Ошибся. Вместо xml.xml= пиши
Код: Выделить всё
xml.loadXML Replace(...
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 10:54

Efiop, ему зачем-то нужно именно из рекордсета. Пусть будет из рекордсета.
Лучший способ понять что-то самому — объяснить это другому.

Efiop
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 69
Зарегистрирован: 06.06.2006 (Вт) 12:14
Откуда: РК

Сообщение Efiop » 18.08.2006 (Пт) 11:18

Antonariy
ему зачем-то нужно именно из рекордсета. Пусть будет из рекордсета.
:)
Но так будет дольше, тем более, если он из одной таблицы хочет перенести записи в другую, понимаю, если бы ему нужно было добавить данные с какого-нить другого места (источника). Но это его личное дело.
Summer.05, если у тебя проблемы с SQL, то пользуйся конструктором запросов из Ацесса, а потом просто выбирай "Режим SQL".

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 11:29

Summer.05 сначала с рекордсетом должен произвести какие-то действия, судя по теме из "Баз данных". Просто изобретение велосипеда для его целей займет больше времени, чем ручная чистка, имхо.
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 18.08.2006 (Пт) 19:26

Efiop
Antonariy
Да, друзья, обсудили вы меня... :)
Докладываю.
Имею базу данных - 38080 тем диссертаций. К сожалению, около 10.000 повторяются. Вручную можно, конечно, убрать, скажем из Exccell или из Access. Решил попробовать убрать программой. Посредством SELECT DISTINCT сумел вывести в рекордсет те темы, которые не повторяются - около 26.000. Теперь их надо как-то сохранить. Все остальные операции осуществляются с базой данных, с файлом *.mdb, где записаны неудаленные, повторяющиеся темы. Вот я и изобретаю велосипед. С Вашей помощью, за которую я очень признателен!
Спасибо!

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 18.08.2006 (Пт) 20:04

Antonariy писал(а):
пиши
Код: Выделить всё
xml.loadXML Replace(...


Написал. Прога задумалась и я уже было начал радоваться, что удалю свои дубли... Но на строке
cn.Open "driver={sql server};database=callcenter;server=(local)"

выскакивает ошибка:

Run-time error '-2147467259 (80004006)
[Microsoft][ODBC SQL Server Driver][Shared Memory] SQL Server does not exist or access denied
:shock:

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 21:36

"driver={sql server};database=callcenter;server=(local)"
Неужели эта строка тебе ни о чем не говорит? Подскажу. Это строка соединения с одной из моих баз.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 18.08.2006 (Пт) 21:47

В общем, прочитав обе темы, я все понял, Efiop был прав
Efiop писал(а):Summer.05,
Спасибо, но источник - рекордсет. А из него выбрать нельзя.

Ты че прикалываешься, вставь этот запрос, туда куда ты вставлял свои запросы. Причем здесь рекордсет.
Как сохранить ее в другой таблице?

Так вот этим запросом и сохранишь свою выборку в другой таблице.
Источник..., а ты выборку от куда делаешь, разве не с базы?
Тебе нужен запрос
Код: Выделить всё
SELECT distinct поля into NewTable from tblSrc
В результате создастся таблица с этими "около 26к записей".
Лучший способ понять что-то самому — объяснить это другому.

Summer.05
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 285
Зарегистрирован: 28.12.2005 (Ср) 20:19
Откуда: Москва

Сообщение Summer.05 » 19.08.2006 (Сб) 14:51

Antonariy
Да, друг, учусь понемногу. Спасибо тебе за помощь и терпение!

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: SemrushBot, Yandex-бот и гости: 83

    TopList