Notifications
Clear all

Erro na conexão com o SQL

4 Posts
1 Usuários
0 Reactions
1,253 Visualizações
(@robo8268)
Posts: 73
Trusted Member
Topic starter
 

Pessoal, estou com um problema com a minha conexão com o SQL.

Se eu setar o meu recordset usando o comando Open, ele dá erro de TimeOut. Se eu uso com objeto do tipo command com a propriedade timeout = 0, aparece o erro dizendo que a operação não é permitida quando o objeto está fechado.

Pesquisei na internet, e vi que a maioria das vezes o erro é na query, porém a minha query está funcionando perfeitamente.

Não consigo upar a planilha aqui no meu trabalho, porque é bloqueado. Segue o código que eu usei:

Public Sub conexaoNice()
Dim sheetMeta As Worksheet, sheetCalculo As Worksheet
Dim cnx As ADODB.Connection
Dim rs As ADODB.Recordset
Dim cmd As ADODB.Command

Dim sql As String, usuario As String


usuario = usuarioLogado()
sql = Query()
Set sheetMeta = ThisWorkbook.Sheets("Metas")
Set sheetCalculo = ThisWorkbook.Sheets("Cálculo Monitoria")


Set cnx = New ADODB.Connection

  
  'iniciando o objeto da conexão
  Set cnx = New ADODB.Connection
  
  'atribuindo as propriedades de conexão (servidor,nome do banco, usuário, senha e etc)
  cnx.ConnectionString = "Provider=SQLOLEDB.1;Persist Security Info=True;User ID=dbkit;Password=dbkit123;Initial Catalog=nice_dw;Data Source=svtt006cto;Use Procedure for Prepare=1;Auto Translate=True;Packet Size=4096;Workstation ID=500010288757-IS;Use Encryption for Data=False;Tag with column collation when possible=False"

  'abrindo a conexão
  cnx.Open
  
  'iniciando o comando
  Set cmd = New ADODB.Command

  With cmd
    .CommandText = sql 'atribuindo o texto da variável ao comando
    .CommandTimeout = 0 'propriedade para não dar erro de Time Out quando a query demorar para executar
    .ActiveConnection = cnx  'dizendo ao comando que a conexão que será usada é a cnx
  End With
  
  'executando o comando e armazenando o resultado no recordset
  Set rs = cmd.Execute(sql)
  

  Sheets("Cálculo Monitoria").Range("D8").CopyFromRecordset rs



   rs.Close
   cnx.Close
  
End Sub


Public Function Query() As String
    Dim rng As Range
    Dim parametros As String, insert As String, sql As String
    Dim i As Integer
    
    Set rng = [Celulas]
    
    parametros = "Declare @mes As Varchar(2)" & vbCrLf & _
    "Declare @usuario As Varchar(100)" & vbCrLf & _
    "Set @mes =" & Chr(39) & [mes] & Chr(39) & vbCrLf & vbCrLf & _
    "Set @usuario =" & Chr(39) & [usuario] & Chr(39) & vbCrLf & _
    "declare @celulas Table(Célula varchar(50))"
    
    
    For i = 1 To rng.Rows.Count
         insert = insert & " INSERT INTO @celulas (Célula) Values(" & Chr(39) & rng.Cells(i) & Chr(39) & ")" & vbCrLf
    Next i
    
    sql = [textoquery]
    
    Query = parametros & insert & sql
    
End Function

no intervalo nomeado [textoquery], coloquei o restante do texto da query...

"Select ISNULL(Quantidade.Qtde,0) AS Qtde

from
(select Célula from @celulas) As Celulas
LEFT JOIN
(
SELECT EQ1.nvcQuestionAnswer As Célula, COUNT(EQ1.iEvalID) as Qtde
from vwNiceDBKitEvaluationQuestions EQ1 join vwNiceDBKitEvaluationQuestions EQ2
ON EQ1.iEvalID = EQ2.iEvalID AND EQ1.iSiteId = EQ2.iSiteId
where YEAR(EQ1.dtCreationTime) = '2016'
and MONTH(EQ1.dtCreationTime)=@mes
and EQ1.nvcCaption = 'Célula'
AND EQ2.nvcCaption = 'Evaluator Full Name'
and EQ2.nvcAnswer = @usuario
GROUP BY EQ1.nvcQuestionAnswer
) As Quantidade
On Quantidade.Célula = Celulas.Célula"

Obrigado

 
Postado : 19/02/2016 1:16 pm
(@robo8268)
Posts: 73
Trusted Member
Topic starter
 

Alguém?

 
Postado : 22/02/2016 5:54 am
(@robo8268)
Posts: 73
Trusted Member
Topic starter
 

Descobri o que está causando o problema, eu estou usando um mesmo comando para inserir e para selecionar os dados, e o ADO não aceita este tipo de procedimento.

Estou tentando separar em duas execuções, porém na segunda a minha variável do tipo table deixa de existir e consequentemente da erro.

Alguém sabe como eu posso executar estes dois comandos?

 
Postado : 22/02/2016 1:05 pm
(@robo8268)
Posts: 73
Trusted Member
Topic starter
 

Resolvi o meu problema, para quem passar pelo mesmo erro, Eis a solução:

1 - Execute um comando para criar a uma tabela temporária ex: create table #teste (teste varchar(50))
2 - faça o select ex: select * from #teste
3 - delete a tabela temporária ex: drop table #teste

cada comando deve ser executado separadamente, mudando a instrução cmd.CommandText e depois executando através do cmd.Execute

 
Postado : 22/02/2016 1:50 pm