Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Подключение к SQL / 25 сообщений из 59, страница 1 из 3
26.08.2013, 12:10
    #38377276
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Добрый день!
Небольшой вопрос: делаю подключение к серверу следующим образом

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
 Private Sub Pusk_Click()

    With ActiveWorkbook.Connections("Подключение1").ODBCConnection
        .BackgroundQuery = False
        .CommandText = S
        .CommandType = xlCmdSql
        .Connection = _
        "ODBC;DRIVER=SQL Server;SERVER=Market6\M6;UID=имя;PWD=пароль;APP=Microsoft Office 2003;WSID=MARKET-BOSSOSS"
        .RefreshOnFileOpen = False
        .SavePassword = True
        .SourceConnectionFile = ""
        .ServerCredentialsMethod = xlCredentialsMethodIntegrated
        .AlwaysUseConnectionFile = False
    End With
    ActiveWorkbook.Connections("Подключение1").Refresh
 End Sub



И в итоге каждый раз создается новое подключение. То есть сейчас есть сводная таблица у которой есть подключение1. И все сработает 1 раз. А при следующем запуске действующее будет уже подключение2, а это уже не работает. Так как сделать чтобы не создавалось новое, а использовалось текущее скажем подключение1?
...
Рейтинг: 0 / 0
26.08.2013, 13:11
    #38377353
Подключение к SQL
mpkfaДобрый день!
И в итоге каждый раз создается новое подключение. То есть сейчас есть сводная таблица у которой есть подключение1. И все сработает 1 раз. А при следующем запуске действующее будет уже подключение2, а это уже не работает. Так как сделать чтобы не создавалось новое, а использовалось текущее скажем подключение1?
А почему бы просто не обновлять существующую сводную таблицу макросом?
Код: vbnet
1.
WorkSheets("MyList").PivotTables("СводнаяТаблица1").PivotCache.Refresh
...
Рейтинг: 0 / 0
26.08.2013, 13:31
    #38377372
PlanB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
...
Рейтинг: 0 / 0
26.08.2013, 14:35
    #38377466
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
грязный комплектовщикmpkfaДобрый день!
И в итоге каждый раз создается новое подключение. То есть сейчас есть сводная таблица у которой есть подключение1. И все сработает 1 раз. А при следующем запуске действующее будет уже подключение2, а это уже не работает. Так как сделать чтобы не создавалось новое, а использовалось текущее скажем подключение1?
А почему бы просто не обновлять существующую сводную таблицу макросом?
Код: vbnet
1.
WorkSheets("MyList").PivotTables("СводнаяТаблица1").PivotCache.Refresh


У меня сам текст запроса формируется из выбранных в комбо боксе и чекбоксе полей, поэтому нужно считать что запрос каждый раз новый и просто обновить существующую таблицу не получится((
...
Рейтинг: 0 / 0
26.08.2013, 14:40
    #38377471
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
PlanB, что то совсем не то...
...
Рейтинг: 0 / 0
26.08.2013, 14:56
    #38377498
PlanB
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
mpkfaPlanB, что то совсем не то... а вы посмотрите там код и отформатируйте для своего случая. connection string просто будет другая. а в целом то, что надо. разбито на открытие/закрытие подключения и действия с базой
...
Рейтинг: 0 / 0
26.08.2013, 15:58
    #38377581
lbppb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
mpkfa,

Попробуйте сначала Refresh, а потом, если возникает ошибка, то уже создавать подключение.
А вообще, если уж делаете через VBA, то лучше не создавать постоянного подключения, а только тогда, когда нужно, что-то вроде вот этого:
Код: vbnet
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
Option Explicit

Sub Query()

Dim oCn As ADODB.Connection
Dim oRs As ADODB.Recordset
Dim sCn As String
Dim sSql As String
Dim sRng As String

Set oCn = New ADODB.Connection
Set oRs = New ADODB.Recordset

sCn = "" 'Your connection string
oCn.Open sCn

sSql = "select * from [tbl]" 'Your query
oRs.Open sSql, oCn

sRng = "A:K"
ActiveSheet.Range(sRng).Clear
PutRecordsetInSheet oRs, ActiveSheet.Range("A1"), True

oRs.Close
oCn.Close
Set oRs = Nothing
Set oCn = Nothing

End Sub

Private Sub PutRecordsetInSheet(ByVal RS As Recordset, ByVal TopLeft As Range, _
    Optional ByVal Headers As Boolean = True)
    Dim objField As ADODB.Field
    Dim i As Integer
    If Headers Then
        For Each objField In RS.Fields
            i = i + 1
            TopLeft.Cells(1, i).Value = objField.Name
        Next objField
        TopLeft.Cells(2, 1).CopyFromRecordset RS
    Else
        TopLeft.Cells(1, 1).CopyFromRecordset RS
    End If
End Sub
...
Рейтинг: 0 / 0
27.08.2013, 09:58
    #38378169
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Интересное предложение. Спасибо. Буду разбираться)
...
Рейтинг: 0 / 0
27.08.2013, 11:02
    #38378280
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Почему то ругается на
Код: vbnet
1.
 oCn As ADODB.Connection 

говорит что User-defined type not defined. Мои познания близки к нулю, так что не ругайтесь на новичка))) Подскажите в чем может быть дело?
...
Рейтинг: 0 / 0
27.08.2013, 11:03
    #38378286
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Может у меня драйвера для ADO соединения не установлены?
...
Рейтинг: 0 / 0
27.08.2013, 11:12
    #38378301
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Надо зайти в References и добавить библиотеку MS ActiveX Data Objects максимальной версии
...
Рейтинг: 0 / 0
27.08.2013, 11:13
    #38378306
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
О да! ее там не было))) Спасибо)))
...
Рейтинг: 0 / 0
27.08.2013, 12:17
    #38378418
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
А теперь ругается на оранжевую строчку что
Код: vbnet
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
 Private Sub Pusk_Click()

Dim oCn As ADODB.Connection
Dim oRs As ADODB.Recordset
Dim sCn As String
Dim sSql As String
Dim sRng As String

Set oCn = New ADODB.Connection
Set oRs = New ADODB.Recordset
oCn.ConnectionTimeout = 0
oCn.CommandTimeout = 0


sCn = "Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=fg;Initial Catalog=B2;Data Source=MARKET6\M6" 'Your connection string
oCn.Open sCn

MsgBox (S)
sSql = S '"select top 100 * from B2.dbo.T1" 'Your query
oRs.Open sSql, oCn

sRng = "A:AA"
ActiveSheet.Range(sRng).Clear
PutRecordsetInSheet oRs, ActiveSheet.Range("A1"), True

oRs.Close
oCn.Close
Set oRs = Nothing
Set oCn = Nothing
End Sub


Private Sub PutRecordsetInSheet(ByVal RS As Recordset, ByVal TopLeft As Range, Optional ByVal Headers As Boolean = True)
    Dim objField As ADODB.Field
    Dim i As Integer
    If Headers Then
        For Each objField In RS.Fields
            i = i + 1
            TopLeft.Cells(1, i).Value = objField.Name
        Next objField 


TopLeft.Cells(2, 1).CopyFromRecordset RS
Код: vbnet
1.
2.
3.
4.
 Else
        TopLeft.Cells(1, 1).CopyFromRecordset RS
    End If
End Sub 


Операция не допускается если объект закрыт. Причем через 45 сек. oCn.ConnectionTimeout = 0
oCn.CommandTimeout = 0
я поставил. А в чем же еще может быть дело? Получается он через 45сек. Recordset закрывает?
...
Рейтинг: 0 / 0
27.08.2013, 12:32
    #38378459
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
У вас создается объект oRS, а копируете данные из RS.
CopyFromRecordset RS
...
Рейтинг: 0 / 0
27.08.2013, 12:39
    #38378472
f
f
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
А, не увидел. Вы передаете параметром.
...
Рейтинг: 0 / 0
27.08.2013, 12:47
    #38378487
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Причем маленький запрос как top 100 * он обрабатывает моментально, а вот когда идет сложный запрос из строки S он думает 45 сек а потом ругается. где то тайм аут выходит а где не понятно. Напрямую запрос S выполняется где то 2 минуты...
...
Рейтинг: 0 / 0
27.08.2013, 13:12
    #38378539
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
mpkfaгде то тайм аут выходит а где не понятноoCn.CommandTimeout
...
Рейтинг: 0 / 0
27.08.2013, 13:18
    #38378551
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Shocker.Pro, дык стоит же 0 - без ограничений
...
Рейтинг: 0 / 0
27.08.2013, 13:33
    #38378571
Shocker.Pro
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
mpkfaгде тотогда что означает эта фраза?
...
Рейтинг: 0 / 0
27.08.2013, 13:36
    #38378576
lbppb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
mpkfa,

Попробуйте вот так:
Код: vbnet
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.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
Private Sub Pusk_Click()

Dim oCn As ADODB.Connection
Dim oRs As ADODB.Recordset
Dim oCmd As ADODB.Command
Dim sCn As String
Dim sSql As String
Dim sRng As String

Set oCn = New ADODB.Connection
Set oRs = New ADODB.Recordset
Set oCmd = New ADODB.Command

oCn.ConnectionTimeout = 0
oCn.CommandTimeout = 0
oCmd.CommandTimeout = 0

sCn = "Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=fg;Initial Catalog=B2;Data Source=MARKET6\M6" 'Your connection string
oCn.Open sCn

sSql = S '"select top 100 * from B2.dbo.T1" 'Your query

oCmd.CommandType = adCmdText
oCmd.CommandText = sSql
oCmd.ActiveConnection = oCn

Set oRs = oCmd.Execute

sRng = "A:AA"
ActiveSheet.Range(sRng).Clear
PutRecordsetInSheet oRs, ActiveSheet.Range("A1"), True

oRs.Close
oCn.Close
Set oCmd = Nothing
Set oRs = Nothing
Set oCn = Nothing

End Sub
...
Рейтинг: 0 / 0
27.08.2013, 13:37
    #38378579
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Shocker.Pro, Это значит что не в Command timeout дело а в чем то другом. А вот в чем я не знаю(((
Есть мысль что Connection и recordset живут независимо друг от друга... То есть на коннект я поставил без ограничений, а он рекордсет закрывает. Только как это исправить не нашел пока...
...
Рейтинг: 0 / 0
27.08.2013, 13:55
    #38378616
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
lbppb, тоже самое. Не получилось(( Но все равно спасибо
...
Рейтинг: 0 / 0
27.08.2013, 14:03
    #38378628
lbppb
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
mpkfalbppb, тоже самое. Не получилось(( Но все равно спасибо

Какого рода у вас запрос? Если данные извлекаются из хранимой процедуры или вида, то вместе с данными возвращается еще и количество строк, тогда тоже возникает именно такая ошибка. SET NOCOUNT в ХП или виде решает проблему.
...
Рейтинг: 0 / 0
27.08.2013, 14:15
    #38378651
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
lbppb, Запрос типа такого
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
Use B2 
SELECT  max(g1.akb_v_obl1) as 'akb1', g1.offtake1,g1.procentakb1, g1.kl1,t.obl,t.god 
FROM B2.dbo.T1 t 
Left Join( 
          SELECT 
          sum(t.kg) / count(distinct t.kodKl) as 'offtake1',
          vsekg.klobl1 as 'akb_v_obl1',
          100 * count(distinct t.kodKl) / vsekg.klobl1 as 'procentakb1',
          count(distinct t.kodKl) as 'kl1',
          t.obl,t.god 
          FROM B2.dbo.T1 t 
              join (
                    SELECT 
                    count(distinct t.kodKl) as 'klobl1',t.obl 
                    FROM B2.dbo.T1 t 
                    WHERE t.god = 12
                    Group By t.obl 
                    ) AS vsekg on vsekg.obl = t.obl  
          WHERE t.god = 12 
          Group By vsekg.klobl1, t.obl, t.god 
          ) AS g1 on     g1.god = t.god AND g1.obl = t.obl  
WHERE t.god = 12 
GROUP BY  g1.offtake1,g1.procentakb1, g1.kl1, t.obl, t.god 



Просто агрегатные функции. На сервере делается за 2 мин 28 сек.
...
Рейтинг: 0 / 0
27.08.2013, 14:16
    #38378654
mpkfa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Подключение к SQL
Запрос напрямую из базы данных
...
Рейтинг: 0 / 0
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Подключение к SQL / 25 сообщений из 59, страница 1 из 3
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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