Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Результат запроса в нужную ячейку Excel / 19 сообщений из 19, страница 1 из 1
14.03.2009, 22:38
    #35869575
dron747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
Дано:
База, эксель
Задача:
В силу ряда причин 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.
Sub Макрос1()
'
' Макрос1 Макрос
'

'
    With ActiveSheet.ListObjects.Add(SourceType:= 0 , Source:=Array( _
        "OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=True;Data Source=Test;Use Procedure for Prepare=1;Auto Transl" _
        , _
        "ate=True;Packet Size=4096;Workstation ID=TEST;Use Encryption for Data=False;Tag with column collation when possible=False;Initia" _
        , "l Catalog=Terminals"), Destination:=Range("$A$1")).QueryTable
        .CommandType = xlCmdTable
        .CommandText = Array("""Terminals"".""dbo"".""Errors""")
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .BackgroundQuery = True
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod =  0 
        .PreserveColumnInfo = True
        .SourceConnectionFile = _
        "D:\Документы\Мои источники данных\Test Errors.odc"
        .ListObject.DisplayName = "Таблица_Test_ Errors"
        .Refresh BackgroundQuery:=False
    End With
End Sub
...
Рейтинг: 0 / 0
15.03.2009, 13:14
    #35869847
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Const strConnectionString As String =" выбери нужную строку на www.connectionstrings.com" -- строка подключения
Dim conn As New ADODB.Connection
Dim rst As New ADODB.Recordset
conn.ConnectionString = strConnectionString
conn.Open
rst.Open "exec ProcName'", conn -- тут запрос к серверу...select или exec
Sheet1.Range("A1").CopyFromRecordset rst --тут вставляем резалтсет на лист екселя
rst.Close
conn.Close
Set rst = Nothing
Set conn = Nothing

ЗЫ Написано по памяти, если что - просьба сильно не пинать :)
...
Рейтинг: 0 / 0
15.03.2009, 13:25
    #35869856
dron747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
Да спасибо, только я в построении макросов вообще не рублю,
ткните где ошибка, вставил Ваш код и вообще теперь на WITH ругается

вот код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Sub Макрос3()
'
' Макрос3 Макрос
'

'
    With
    Private Const strConnectionString As String = "OLEDB;Provider=SQLOLEDB.1;Password=111;Persist Security Info=True;User ID=sa;Data Source=test;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TEST;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Terminals"
    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    conn.ConnectionString = strConnectionString
    conn.Open
    rst.Open "SELECT [TerminalID],[Name] FROM [Terminals].[dbo].[Terminals]"
    Sheet1.Range("A1").CopyFromRecordset rst
    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
        
    End With
End Sub

Скриншот ошибки в файле
...
Рейтинг: 0 / 0
15.03.2009, 13:29
    #35869863
Шыфл
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
dron747,

With тебе тут совершенно не нужен в твоём написании. Убери его и всё
...
Рейтинг: 0 / 0
15.03.2009, 14:18
    #35869893
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
dron747,

With и End With нужно убрать из макроса

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
15.03.2009, 15:55
    #35869967
dron747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
Шыфлdron747,

With тебе тут совершенно не нужен в твоём написании. Убери его и всё

Да фиг там, убрал не работает сволочь, люди шарящие в VB подскажите пожалуйста

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
Sub Макрос1()

  
    Private Const strConnectionString As String = "OLEDB;Provider=SQLOLEDB.1;Password=111;Persist Security Info=True;User ID=sa;Data Source=test;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=TEST;Use Encryption for Data=False;Tag with column collation when possible=False;Initial Catalog=Terminals"
    Dim conn As New ADODB.Connection
    Dim rst As New ADODB.Recordset
    conn.ConnectionString = strConnectionString
    conn.Open
    rst.Open "SELECT [TerminalID],[Name] FROM [Terminals].[dbo].[Terminals]"
    Sheet1.Range("A1").CopyFromRecordset rst
    rst.Close
    conn.Close
    Set rst = Nothing
    Set conn = Nothing
        


End Sub
...
Рейтинг: 0 / 0
16.03.2009, 01:21
    #35870367
урка1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
В ентом коде, рыбятки, есть пара приниципиальных моментов, который упущены:

1. Провайдер надо указывать в ЯВНОМ виде, а не в строке коннекта. Иначе - будет сообщение, что MSDASQL не находит драйвера.
2. Bторой момент - что это такое Sheet1? Ясно, что он будет всегда Nothing.
3. Не надо умничать и выполнять сборку памяти самому. Среда васика достаточно умная, чтобы почистить кеш памяти самостоятельно в нужный для нее момент. Когда эти коннекты чистятся из хулиганских побуждений (как в коде выше) - это просто очистит пул коннектов, что просто ВЕСЬМА существенно увеличит время коннекта к базе. Например, при повторных коннектах, они будут проходить не за полсекунды, а например за пять секунд.
4. Не надо забывать ставить ссылку на библиотеку ADO - внутри васика - TOOLS->REFERENCES. Иначе это просто не скомпилицца.


Итого, ВЕРНЫЙ вариант кода выгдядит так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Sub Кнопка1_Тынц()
    Dim conn As New ADODB.Connection
    conn.ConnectionString = "Data Source=DEV;Initial Catalog=MED1;User ID=MoscowDown;Password=123456"
    conn.Provider = "SQLOLEDB"
    conn.Open
    Dim rst As New ADODB.Recordset
    rst.ActiveConnection = conn
    rst.Open "select i,TXT from Bugs where CrDate>'" & Cells( 1 ,  1 ) & "'", conn
    ActiveWorkbook.ActiveSheet.Range("B2").CopyFromRecordset rst
    rst.Close
    conn.Close
End Sub


всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
16.03.2009, 09:43
    #35870576
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
урка1В ентом коде, рыбятки, есть пара приниципиальных моментов, который упущены:

1. Провайдер надо указывать в ЯВНОМ виде, а не в строке коннекта. Иначе - будет сообщение, что MSDASQL не находит драйвера.
2. Bторой момент - что это такое Sheet1? Ясно, что он будет всегда Nothing.
3. Не надо умничать и выполнять сборку памяти самому. Среда васика достаточно умная, чтобы почистить кеш памяти самостоятельно в нужный для нее момент. Когда эти коннекты чистятся из хулиганских побуждений (как в коде выше) - это просто очистит пул коннектов, что просто ВЕСЬМА существенно увеличит время коннекта к базе. Например, при повторных коннектах, они будут проходить не за полсекунды, а например за пять секунд.
4. Не надо забывать ставить ссылку на библиотеку ADO - внутри васика - TOOLS->REFERENCES. Иначе это просто не скомпилицца.

ну...так категорично сказано, что не могу не высказать пару замечаний:
1. Провайдер указывается в строке коннекта - это не вызывет никаких проблем при подключении, например:"Provider=sqloledb;Data Source=servername.....". Стоит в рабочем коде, проблем не замечено.
2. Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 .
3. Умничать не надо, согласен, вполне возможно васик сам удалит ненужные переменные. Но с каких пор выгрузка из памяти 1 переменной приводит к очистке всего пула коннектов? непонятно...
...
Рейтинг: 0 / 0
16.03.2009, 19:46
    #35872565
урка1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
To caper . Ты совершенно четко подсказал товарисчу про CopyFromRecordset. Это хорошо.
Теперь ответ на твои вопросы.

1. Нет. Указание провайдера в строке коннекта не даст его изменение с MSDASQL на SQLOLEDB. Проверено тыщу раз. Тот тынц, который я дал - я получил именно в первой попытке, когда попытался схитрожопить не указывая напрямую провайдера, а указывая провайдера косвенно в строке коннекта. Получил ровно то, что ты видишь в строке поиска в Гугле.

2. "Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 ." Категорически нет. Это может ВДРУГ случайно стработать - есть у тебя не локализованная версия Excel. Если не понимаешь о чем речь - открой такой макрос в русифицированном Excel.

3. Теряется ссылка на пул. Не полная очистка пула, а потеря ссылки на него.


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

всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
16.03.2009, 20:24
    #35872638
урка1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
3... а ссылок не будет - сборщик мусора возьмет и удалит всю память обьета "пул" нах.

всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
17.03.2009, 09:19
    #35873105
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
урка1,

ну, тут просто неправильный формат строки подключения ;)
напиши " Provider=sqloledb ;Data Source..." - и будет все ок..
...
Рейтинг: 0 / 0
17.03.2009, 09:20
    #35873107
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
урка13... а ссылок не будет - сборщик мусора возьмет и удалит всю память обьета "пул" нах.

а тут бы ссылку на msdn не помешало бы, ибо тестировать сложно, а логике явно противоречит.
...
Рейтинг: 0 / 0
17.03.2009, 09:26
    #35873120
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
урка1 To caper .
2. "Если в екселе есть хотя бы один лист, то именно он и будет в Sheet1, по крайней мере в 2007 ." Категорически нет. Это может ВДРУГ случайно стработать - есть у тебя не локализованная версия Excel. Если не понимаешь о чем речь - открой такой макрос в русифицированном Excel.

Согласен - у меня везде стоят английские версии + MUI.
Нашел русскую версию - sheet1 дает ошибку - не объект :)
...
Рейтинг: 0 / 0
17.03.2009, 11:14
    #35873397
урка1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
Да, со строкой коннекта согласен - у топикстартера формат, который сжирает только NET-провайдер. Эта строка зависит от логики провайдера. Не уверен, что КАЖДЫЙ провайдер обрабатывает "Provider=". Если же ты явно провайдера указываешь - то как-то спокойнее. Хотя в данном конкретном случае - там по умолчанию стоит MsDASQL- а нам SqlOleDB нужен - а он сожрет параметр Provider.
Хотя не знаю, может можно как-то установить, что провайдер по умолчанию НЕ будет MSDASQL. Тогда надо думать - какой ИМЕННО там стоит провайдер. И думать - сожрет ли он параметр "Provider=". Мне в этом направлении думать лень - поэтому я указал его явно.


Что касается пула. Ну ссылку мне искать некогда. Я ориентируюсь общую на логику сборки мусора. Почему ты считаешь, что обьект, на который НЕ СОВСЕМ ссылок - не будет удален. Конечно будет. А обьект, ведущий пул - это простой обьект (секция кода, секция временных переменных и так далее). Нету ссылок на этот обьект из программ - и привет-медвед этому обьекту. А пока ты обьект Connection не почистил - ссылка гарантированно стоит.
Тестировать пулы просто. Время коннекта. У рихтера был какой-то тест, помнится.


всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
17.03.2009, 11:44
    #35873523
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
урка1Да, со строкой коннекта согласен - у топикстартера формат, который сжирает только NET-провайдер. Эта строка зависит от логики провайдера. Не уверен, что КАЖДЫЙ провайдер обрабатывает "Provider=". Если же ты явно провайдера указываешь - то как-то спокойнее. Хотя в данном конкретном случае - там по умолчанию стоит MsDASQL- а нам SqlOleDB нужен - а он сожрет параметр Provider.
Хотя не знаю, может можно как-то установить, что провайдер по умолчанию НЕ будет MSDASQL. Тогда надо думать - какой ИМЕННО там стоит провайдер. И думать - сожрет ли он параметр "Provider=". Мне в этом направлении думать лень - поэтому я указал его явно.
как мне кажется, тут несколько спутаны понятия "объект доступа к данным" и "провайдер доступа к конкретному серверу".
Мы поключаем библиотеку ADO, которая умеет работать с разными провайдерами, и ей можно задать нужного провайдера как в строке коннекта, так и через свойства соотв. класса, именно ADODB парсит строку конекта и инициализирует соотв. свойства значениями, указанными в ней, или дефолтными значениями, если они не заданы в строке коннекта...

урка1
Что касается пула. Ну ссылку мне искать некогда. Я ориентируюсь общую на логику сборки мусора. Почему ты считаешь, что обьект, на который НЕ СОВСЕМ ссылок - не будет удален. Конечно будет. А обьект, ведущий пул - это простой обьект (секция кода, секция временных переменных и так далее). Нету ссылок на этот обьект из программ - и привет-медвед этому обьекту. А пока ты обьект Connection не почистил - ссылка гарантированно стоит.
Тестировать пулы просто. Время коннекта. У рихтера был какой-то тест, помнится.

в моих букварях было сказано, что коннект к БД - это ограниченный ресурс, сделал свое дело - не держи коннект. А вот как "не держать коннект" - просто закрыв или убив соотв. переменную, я точно не помню... Посмотрел примеры MS - там 80% (из просмотренных) примеров работы заканчиваются на rst.Close, так что пусть работает "сборщик мусора" :)
...
Рейтинг: 0 / 0
17.03.2009, 14:39
    #35874181
урка1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
1. По первому вопросу. Я на это смотрю иначе. Ты опираешься на то, что в библиотеке есть секция с литерами. В одной из этих секций вписана текстовая строка "MSDASQL". Это то ИМЯ, которое попадет в провайдер по умолчанию. Действительно, этот (и только этот провайдер) понимает PROVIDER="OleDB".

Но... Кто тебе сказал, что какая-то софтина (встроенная в виндузню или приблудная-внешняя) - не заменить эту строки например на ODBC или на ISAM. Эти провайдеры НЕ ПОНИМАЮТ параметра Provider="ОleDB". Так же, как у топик-стартера (как ты видишь из его кода) - был ВООБЩЕ другой провайдер доступа к данным (которому просто можно указать "Oledb", даже без слова "Provider=").

Твой код просто опирается на несколько предположений. Ты предположил, что в секции литералов:
-- в качестве ИМЕНИ провайдера по умолчанию вписано "MsDasql"
-- в секции с локализацией нет ничего
Эти оба предположения сразу резанули мне глаза. Ты ведь пишешь код не для себя? Я по крайней мере пишу его ДЛЯ ДРУГИЗ ЗА ДЕНЬГИ. И я отдам этот код в бухгалтерию, например. И кто сказал, что бухгалтер там например не из Белорусии и Sheet1 у нее не называется "странЫцЯ" - или как-то так.

Та же самая ситуация с провайдером по умолчанию. Кто сказал - что там, куда я отдам этот код в той же самой секции литералов будет вписано именно MSDASQL, а не ODBC - и этот провайдер УДАЧНО разберет конструкцию "Provider=". А какие провайдеры будут через год. Кто ПРОГАРАНТИРУЕТ, что они понимают конструкцию "Provider=ххх".

Ну а сборку мусора просто проверить - оберни все это в цикл из миллиона итераций - и в одном случае оставь там NOTHING, в другом - без него. Думаю, результат будет впечатляющий. Правда тут наложится эффект не только пула, но и общей инициализации. И еще - если будет делать этот тест - не забудь размер пула установить БОЛЬШЕ числа итераций. Иначе смысла в тесте нет. Мне это делать лень - я с этим игрался много раз.

Простовот эти пару моментов в твоем коде - они сразу резанули мне глаза - и я подправил твой код. Не спорю, можно ПОДГАДАТЬ некое сочетание текстовых литералов - чтобы и твой код вдруг сработал. НО...


всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
17.03.2009, 14:51
    #35874211
caper
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
урка1,
жесть...

в качестве замечания - мы используем ADODB, конкретную библиотеку, которая понимает определение провайдера в строке подключения, и про нее речь и идет в топике.

остальной текст не осилил.
из темы ушел.
...
Рейтинг: 0 / 0
17.03.2009, 16:10
    #35874516
урка1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Результат запроса в нужную ячейку Excel
Код: plaintext
ADODB, конкретную библиотеку, которая понимает определение провайдера в строке подключения
ну может ты и прав с этим - только я предпочитаю это явно указывать

ладно, мне тоже тошнит уже от этого топика

всех зачистим и замочим, а кто спрячется - персонального доктора вышлем
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Результат запроса в нужную ячейку Excel / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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