STORED PROCEDURE COM PARÂMETROS
Alterado em 12/12/2024 08:49:02
Senhores,
Preciso recuperar um valor com uma Stored Procedure no Access. O problema é que o VBA diz que está incoreto.
A procedure só faz um SELECT em uma tabela:
O código VBA é este:
O problema é que eu tenho outras Procedures que funcionam. A diferença é que esta (que não está funcionado) é um SELECT e as outras (que funcionam, incusive com parâmetros) são INSERT e UPDATE.
OBS.: Fiz um teste com a procedure, retirando o parâmetro e funcionou. Com o parâmetro não funciona.
OBS2.: no Access, o campo "cod" é do tipo "Numeração automática" e campo "bandeira" é do tipo "Texto curto".
Preciso recuperar um valor com uma Stored Procedure no Access. O problema é que o VBA diz que está incoreto.
A procedure só faz um SELECT em uma tabela:
SELECT cod
FROM tblBandeirasPix
WHERE bandeira = pBandeira;
O código VBA é este:
Public Function pegaIndexBandeira(ByVal pProcedure As String, ByVal pBandeira As String) As Integer
Set objCommand = New ADODB.Command
On Error GoTo deuRuim
With objCommand
.CommandText = pProcedure 'NOME DA PROCEDURE NO ACCESS
.CommandType = adCmdStoredProc
' ERRO AQUI NA LINHA DE BAIXO
.Parameters.Append .CreateParameter("pBandeira", adVarChar, adParamInput)
.Parameters.Item("pBandeira").Value = pBandeira
Set DB2 = New ADODB.Connection
DB2.Open stringConexao
.ActiveConnection = DB2
Set rst2 = .Execute
...
End With
End Function
O problema é que eu tenho outras Procedures que funcionam. A diferença é que esta (que não está funcionado) é um SELECT e as outras (que funcionam, incusive com parâmetros) são INSERT e UPDATE.
OBS.: Fiz um teste com a procedure, retirando o parâmetro e funcionou. Com o parâmetro não funciona.
OBS2.: no Access, o campo "cod" é do tipo "Numeração automática" e campo "bandeira" é do tipo "Texto curto".
Public Function pegaIndexBandeira(ByVal pProcedure As String, ByVal pBandeira As String) As Integer
Dim objCommand As ADODB.Command
Dim DB2 As ADODB.Connection
Dim rst2 As ADODB.Recordset
On Error GoTo deuRuim
' Inicializando objetos
Set objCommand = New ADODB.Command
Set DB2 = New ADODB.Connection
' Abrindo a conexão
DB2.Open stringConexao
' Configurando o comando
With objCommand
.ActiveConnection = DB2
.CommandText = pProcedure ' Nome da consulta no Access'
.CommandType = adCmdStoredProc ' Ou adCmdText se necessário'
' Adicionando o parâmetro
.Parameters.Append .CreateParameter("pBandeira", adVarChar, adParamInput, 255, pBandeira)
' Executando o comando
Set rst2 = .Execute
' Recuperando o valor
If Not rst2.EOF Then
pegaIndexBandeira = rst2.Fields("cod").Value
Else
pegaIndexBandeira = -1 ' Nenhum registro encontrado
End If
rst2.Close
End With
' Fechando a conexão
DB2.Close
Set rst2 = Nothing
Set objCommand = Nothing
Set DB2 = Nothing
Exit Function
deuRuim:
' Tratamento de erros
MsgBox "Erro: " & Err.Description, vbCritical, "Erro"
pegaIndexBandeira = -1
If Not rst2 Is Nothing Then If rst2.State = adStateOpen Then rst2.Close
If Not DB2 Is Nothing Then If DB2.State = adStateOpen Then DB2.Close
Set rst2 = Nothing
Set objCommand = Nothing
Set DB2 = Nothing
End Function
Verifique se pProcedure é o nome exato da consulta armazenada no Access.
Certifique-se de que stringConexao esteja correta e compatível com seu banco de dados.
Teste com adCmdText, substituindo o nome da consulta por:
vba
Copiar código
"PARAMETERS pBandeira Text(255); SELECT cod FROM tblBandeirasPix WHERE bandeira = pBandeira;"
Dim objCommand As ADODB.Command
Dim DB2 As ADODB.Connection
Dim rst2 As ADODB.Recordset
On Error GoTo deuRuim
' Inicializando objetos
Set objCommand = New ADODB.Command
Set DB2 = New ADODB.Connection
' Abrindo a conexão
DB2.Open stringConexao
' Configurando o comando
With objCommand
.ActiveConnection = DB2
.CommandText = pProcedure ' Nome da consulta no Access'
.CommandType = adCmdStoredProc ' Ou adCmdText se necessário'
' Adicionando o parâmetro
.Parameters.Append .CreateParameter("pBandeira", adVarChar, adParamInput, 255, pBandeira)
' Executando o comando
Set rst2 = .Execute
' Recuperando o valor
If Not rst2.EOF Then
pegaIndexBandeira = rst2.Fields("cod").Value
Else
pegaIndexBandeira = -1 ' Nenhum registro encontrado
End If
rst2.Close
End With
' Fechando a conexão
DB2.Close
Set rst2 = Nothing
Set objCommand = Nothing
Set DB2 = Nothing
Exit Function
deuRuim:
' Tratamento de erros
MsgBox "Erro: " & Err.Description, vbCritical, "Erro"
pegaIndexBandeira = -1
If Not rst2 Is Nothing Then If rst2.State = adStateOpen Then rst2.Close
If Not DB2 Is Nothing Then If DB2.State = adStateOpen Then DB2.Close
Set rst2 = Nothing
Set objCommand = Nothing
Set DB2 = Nothing
End Function
Verifique se pProcedure é o nome exato da consulta armazenada no Access.
Certifique-se de que stringConexao esteja correta e compatível com seu banco de dados.
Teste com adCmdText, substituindo o nome da consulta por:
vba
Copiar código
"PARAMETERS pBandeira Text(255); SELECT cod FROM tblBandeirasPix WHERE bandeira = pBandeira;"
Problema resolvido!
FABRICIOWEB,
Funcionou.
OBRIGADO!!!!!
Parece que meu erro, neste caso, foi colocar a variável DB2 depois da criação dos parâmetros do objCommand.
Logo que modifiquei o código (conforme você disse) e coloquei o DB2.Open antes da configuração do objCommand, o código funcionou na hora.
Engraçado que todos os meus códigos têm o DB2.Open depois da configuração do objCommand e funcionam, mas, enfim, graças a você, o problema foi resolvido.
Paz e saúde!
Tópico encerrado , respostas não são mais permitidas