|
|
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
Дано: База, эксель Задача: В силу ряда причин Reporting Services не используем Необходим кусок кода Макрос, который наглядно показывает, как подключиться к б/д и от туда вытащить данные в нужные ячейки Excel. Так как в VB не рублю прошу привести работающий кусок кода Макроса Т.е. конекшен стринг, куда логин пароль писать, куда вставлять запрос на SQL и куда вставит данные Данный код был получен с помощью тупой записи действий в Excel для получения данных ив от что вышло. Остались вопросы где конекшен стринг, и где SQl код? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2009, 22:38 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ЗЫ Написано по памяти, если что - просьба сильно не пинать :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2009, 13:14 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
Да спасибо, только я в построении макросов вообще не рублю, ткните где ошибка, вставил Ваш код и вообще теперь на WITH ругается вот код Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. Скриншот ошибки в файле ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2009, 13:25 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
dron747, With тебе тут совершенно не нужен в твоём написании. Убери его и всё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2009, 13:29 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
dron747, With и End With нужно убрать из макроса Модератор: Тема перенесена из форума "Microsoft SQL Server". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2009, 14:18 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
Шыфлdron747, With тебе тут совершенно не нужен в твоём написании. Убери его и всё Да фиг там, убрал не работает сволочь, люди шарящие в VB подскажите пожалуйста Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2009, 15:55 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
В ентом коде, рыбятки, есть пара приниципиальных моментов, который упущены: 1. Провайдер надо указывать в ЯВНОМ виде, а не в строке коннекта. Иначе - будет сообщение, что MSDASQL не находит драйвера. 2. Bторой момент - что это такое Sheet1? Ясно, что он будет всегда Nothing. 3. Не надо умничать и выполнять сборку памяти самому. Среда васика достаточно умная, чтобы почистить кеш памяти самостоятельно в нужный для нее момент. Когда эти коннекты чистятся из хулиганских побуждений (как в коде выше) - это просто очистит пул коннектов, что просто ВЕСЬМА существенно увеличит время коннекта к базе. Например, при повторных коннектах, они будут проходить не за полсекунды, а например за пять секунд. 4. Не надо забывать ставить ссылку на библиотеку ADO - внутри васика - TOOLS->REFERENCES. Иначе это просто не скомпилицца. Итого, ВЕРНЫЙ вариант кода выгдядит так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. всех зачистим и замочим, а кто спрячется - персонального доктора вышлем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 01:21 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
урка1В ентом коде, рыбятки, есть пара приниципиальных моментов, который упущены: 1. Провайдер надо указывать в ЯВНОМ виде, а не в строке коннекта. Иначе - будет сообщение, что MSDASQL не находит драйвера. 2. Bторой момент - что это такое Sheet1? Ясно, что он будет всегда Nothing. 3. Не надо умничать и выполнять сборку памяти самому. Среда васика достаточно умная, чтобы почистить кеш памяти самостоятельно в нужный для нее момент. Когда эти коннекты чистятся из хулиганских побуждений (как в коде выше) - это просто очистит пул коннектов, что просто ВЕСЬМА существенно увеличит время коннекта к базе. Например, при повторных коннектах, они будут проходить не за полсекунды, а например за пять секунд. 4. Не надо забывать ставить ссылку на библиотеку ADO - внутри васика - TOOLS->REFERENCES. Иначе это просто не скомпилицца. ну...так категорично сказано, что не могу не высказать пару замечаний: 1. Провайдер указывается в строке коннекта - это не вызывет никаких проблем при подключении, например:"Provider=sqloledb;Data Source=servername.....". Стоит в рабочем коде, проблем не замечено. 2. Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 . 3. Умничать не надо, согласен, вполне возможно васик сам удалит ненужные переменные. Но с каких пор выгрузка из памяти 1 переменной приводит к очистке всего пула коннектов? непонятно... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 09:43 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
To caper . Ты совершенно четко подсказал товарисчу про CopyFromRecordset. Это хорошо. Теперь ответ на твои вопросы. 1. Нет. Указание провайдера в строке коннекта не даст его изменение с MSDASQL на SQLOLEDB. Проверено тыщу раз. Тот тынц, который я дал - я получил именно в первой попытке, когда попытался схитрожопить не указывая напрямую провайдера, а указывая провайдера косвенно в строке коннекта. Получил ровно то, что ты видишь в строке поиска в Гугле. 2. "Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 ." Категорически нет. Это может ВДРУГ случайно стработать - есть у тебя не локализованная версия Excel. Если не понимаешь о чем речь - открой такой макрос в русифицированном Excel. 3. Теряется ссылка на пул. Не полная очистка пула, а потеря ссылки на него. всех зачистим и замочим, а кто спрячется - персонального доктора вышлем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 19:46 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
Вот этот скрин рассмотри внимательно. В нем ответ для тебя на твои два вопроса. всех зачистим и замочим, а кто спрячется - персонального доктора вышлем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 20:03 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
3... а ссылок не будет - сборщик мусора возьмет и удалит всю память обьета "пул" нах. всех зачистим и замочим, а кто спрячется - персонального доктора вышлем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.03.2009, 20:24 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
урка1, ну, тут просто неправильный формат строки подключения ;) напиши " Provider=sqloledb ;Data Source..." - и будет все ок.. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 09:19 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
урка13... а ссылок не будет - сборщик мусора возьмет и удалит всю память обьета "пул" нах. а тут бы ссылку на msdn не помешало бы, ибо тестировать сложно, а логике явно противоречит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 09:20 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
урка1 To caper . 2. "Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 ." Категорически нет. Это может ВДРУГ случайно стработать - есть у тебя не локализованная версия Excel. Если не понимаешь о чем речь - открой такой макрос в русифицированном Excel. Согласен - у меня везде стоят английские версии + MUI. Нашел русскую версию - sheet1 дает ошибку - не объект :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 09:26 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
Да, со строкой коннекта согласен - у топикстартера формат, который сжирает только NET-провайдер. Эта строка зависит от логики провайдера. Не уверен, что КАЖДЫЙ провайдер обрабатывает "Provider=". Если же ты явно провайдера указываешь - то как-то спокойнее. Хотя в данном конкретном случае - там по умолчанию стоит MsDASQL- а нам SqlOleDB нужен - а он сожрет параметр Provider. Хотя не знаю, может можно как-то установить, что провайдер по умолчанию НЕ будет MSDASQL. Тогда надо думать - какой ИМЕННО там стоит провайдер. И думать - сожрет ли он параметр "Provider=". Мне в этом направлении думать лень - поэтому я указал его явно. Что касается пула. Ну ссылку мне искать некогда. Я ориентируюсь общую на логику сборки мусора. Почему ты считаешь, что обьект, на который НЕ СОВСЕМ ссылок - не будет удален. Конечно будет. А обьект, ведущий пул - это простой обьект (секция кода, секция временных переменных и так далее). Нету ссылок на этот обьект из программ - и привет-медвед этому обьекту. А пока ты обьект Connection не почистил - ссылка гарантированно стоит. Тестировать пулы просто. Время коннекта. У рихтера был какой-то тест, помнится. всех зачистим и замочим, а кто спрячется - персонального доктора вышлем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 11:14 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
урка1Да, со строкой коннекта согласен - у топикстартера формат, который сжирает только NET-провайдер. Эта строка зависит от логики провайдера. Не уверен, что КАЖДЫЙ провайдер обрабатывает "Provider=". Если же ты явно провайдера указываешь - то как-то спокойнее. Хотя в данном конкретном случае - там по умолчанию стоит MsDASQL- а нам SqlOleDB нужен - а он сожрет параметр Provider. Хотя не знаю, может можно как-то установить, что провайдер по умолчанию НЕ будет MSDASQL. Тогда надо думать - какой ИМЕННО там стоит провайдер. И думать - сожрет ли он параметр "Provider=". Мне в этом направлении думать лень - поэтому я указал его явно. как мне кажется, тут несколько спутаны понятия "объект доступа к данным" и "провайдер доступа к конкретному серверу". Мы поключаем библиотеку ADO, которая умеет работать с разными провайдерами, и ей можно задать нужного провайдера как в строке коннекта, так и через свойства соотв. класса, именно ADODB парсит строку конекта и инициализирует соотв. свойства значениями, указанными в ней, или дефолтными значениями, если они не заданы в строке коннекта... урка1 Что касается пула. Ну ссылку мне искать некогда. Я ориентируюсь общую на логику сборки мусора. Почему ты считаешь, что обьект, на который НЕ СОВСЕМ ссылок - не будет удален. Конечно будет. А обьект, ведущий пул - это простой обьект (секция кода, секция временных переменных и так далее). Нету ссылок на этот обьект из программ - и привет-медвед этому обьекту. А пока ты обьект Connection не почистил - ссылка гарантированно стоит. Тестировать пулы просто. Время коннекта. У рихтера был какой-то тест, помнится. в моих букварях было сказано, что коннект к БД - это ограниченный ресурс, сделал свое дело - не держи коннект. А вот как "не держать коннект" - просто закрыв или убив соотв. переменную, я точно не помню... Посмотрел примеры MS - там 80% (из просмотренных) примеров работы заканчиваются на rst.Close, так что пусть работает "сборщик мусора" :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 11:44 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
1. По первому вопросу. Я на это смотрю иначе. Ты опираешься на то, что в библиотеке есть секция с литерами. В одной из этих секций вписана текстовая строка "MSDASQL". Это то ИМЯ, которое попадет в провайдер по умолчанию. Действительно, этот (и только этот провайдер) понимает PROVIDER="OleDB". Но... Кто тебе сказал, что какая-то софтина (встроенная в виндузню или приблудная-внешняя) - не заменить эту строки например на ODBC или на ISAM. Эти провайдеры НЕ ПОНИМАЮТ параметра Provider="ОleDB". Так же, как у топик-стартера (как ты видишь из его кода) - был ВООБЩЕ другой провайдер доступа к данным (которому просто можно указать "Oledb", даже без слова "Provider="). Твой код просто опирается на несколько предположений. Ты предположил, что в секции литералов: -- в качестве ИМЕНИ провайдера по умолчанию вписано "MsDasql" -- в секции с локализацией нет ничего Эти оба предположения сразу резанули мне глаза. Ты ведь пишешь код не для себя? Я по крайней мере пишу его ДЛЯ ДРУГИЗ ЗА ДЕНЬГИ. И я отдам этот код в бухгалтерию, например. И кто сказал, что бухгалтер там например не из Белорусии и Sheet1 у нее не называется "странЫцЯ" - или как-то так. Та же самая ситуация с провайдером по умолчанию. Кто сказал - что там, куда я отдам этот код в той же самой секции литералов будет вписано именно MSDASQL, а не ODBC - и этот провайдер УДАЧНО разберет конструкцию "Provider=". А какие провайдеры будут через год. Кто ПРОГАРАНТИРУЕТ, что они понимают конструкцию "Provider=ххх". Ну а сборку мусора просто проверить - оберни все это в цикл из миллиона итераций - и в одном случае оставь там NOTHING, в другом - без него. Думаю, результат будет впечатляющий. Правда тут наложится эффект не только пула, но и общей инициализации. И еще - если будет делать этот тест - не забудь размер пула установить БОЛЬШЕ числа итераций. Иначе смысла в тесте нет. Мне это делать лень - я с этим игрался много раз. Простовот эти пару моментов в твоем коде - они сразу резанули мне глаза - и я подправил твой код. Не спорю, можно ПОДГАДАТЬ некое сочетание текстовых литералов - чтобы и твой код вдруг сработал. НО... всех зачистим и замочим, а кто спрячется - персонального доктора вышлем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 14:39 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
урка1, жесть... в качестве замечания - мы используем ADODB, конкретную библиотеку, которая понимает определение провайдера в строке подключения, и про нее речь и идет в топике. остальной текст не осилил. из темы ушел. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 14:51 |
|
||
|
Результат запроса в нужную ячейку Excel
|
|||
|---|---|---|---|
|
#18+
Код: plaintext ладно, мне тоже тошнит уже от этого топика всех зачистим и замочим, а кто спрячется - персонального доктора вышлем ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.03.2009, 16:10 |
|
||
|
|

start [/forum/topic.php?fid=60&msg=35869863&tid=2161249]: |
0ms |
get settings: |
6ms |
get forum list: |
8ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
131ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
47ms |
get tp. blocked users: |
1ms |
| others: | 195ms |
| total: | 403ms |

| 0 / 0 |
