HOUVE UM ERRO NA CONEXÃO COM O BANCO DE DADOS
Olá pessoal,
Estou fazendo o projeto da apostila do vb6, Biblioteca, antes estava usando a conexão com o banco de dados com o seguinte provedor:
Provider=ADsDSOObject;Encrypt Password=False;Data Source=D:\Projeto\Visual Basic\Bibliotecario\Biblio.mdb, foi feita mas com erros, neste caso estava dando erro ao gravar os dados, pesquisei e verifiquei que poderia ser devido ao erro do provedor.
Após conseguir usar o seguinte provedor:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Projeto\Visual Basic\Bibliotecario\Biblio.accdb, foi feita com sucesso mas agora esta dando erro o seguinte erro:
Houve um erro na conexão com o banco de dados.
Pesquisei e esta relacionado ao Microsoft ActiveX mas não encontrei nenhuma solução, alguém pode me ajudar por favor.
Estou fazendo o projeto da apostila do vb6, Biblioteca, antes estava usando a conexão com o banco de dados com o seguinte provedor:
Provider=ADsDSOObject;Encrypt Password=False;Data Source=D:\Projeto\Visual Basic\Bibliotecario\Biblio.mdb, foi feita mas com erros, neste caso estava dando erro ao gravar os dados, pesquisei e verifiquei que poderia ser devido ao erro do provedor.
Após conseguir usar o seguinte provedor:
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Projeto\Visual Basic\Bibliotecario\Biblio.accdb, foi feita com sucesso mas agora esta dando erro o seguinte erro:
Houve um erro na conexão com o banco de dados.
Pesquisei e esta relacionado ao Microsoft ActiveX mas não encontrei nenhuma solução, alguém pode me ajudar por favor.
O erro acontece na hora da conexão ou na hora de tentar salvar alguma coisa?
Tá usando DAO ou ADO?
Reparei que no primeiro caso você usou um arquivo na versão 2003... e no segundo, o accdb (2007, posterior). Algum motivo para isso?
Já tentou usar o driver ODBC? Ele é nativo, e sempre que tiver o Office instalado, lá estará ele. Se não quer, tem certeza que você tem o provedor configurado na sua máquina?
Abraços!
Tá usando DAO ou ADO?
Reparei que no primeiro caso você usou um arquivo na versão 2003... e no segundo, o accdb (2007, posterior). Algum motivo para isso?
Já tentou usar o driver ODBC? Ele é nativo, e sempre que tiver o Office instalado, lá estará ele. Se não quer, tem certeza que você tem o provedor configurado na sua máquina?
Abraços!
O erro acontece na hora da conexão
Atualmente estou usando o ADO, testei usar todas as versões sem sucesso.
No primeiro caso a conexão com o banco foi feita gerando erros e com isso estava dando erro ao salvar um cadastro, na segunda a conexão foi feita com sucesso mas na hora da conexão esta gerando outro erro.
Tentei usar o driver Ole db Provider ODBC drivers sem sucesso, o Simple Provider sem sucesso, o único que conectou mas com erros foi o Provider for Microsoft Directory Service.
Com a versão mais recente do office habilitou a opção Microsoft Office 12.0 Access e a conexão foi feita com sucesso mas na hora de executar esta dando o erro informado, mesmo alterando para a extensão dom banco para mdb.
Atualmente estou usando o ADO, testei usar todas as versões sem sucesso.
No primeiro caso a conexão com o banco foi feita gerando erros e com isso estava dando erro ao salvar um cadastro, na segunda a conexão foi feita com sucesso mas na hora da conexão esta gerando outro erro.
Tentei usar o driver Ole db Provider ODBC drivers sem sucesso, o Simple Provider sem sucesso, o único que conectou mas com erros foi o Provider for Microsoft Directory Service.
Com a versão mais recente do office habilitou a opção Microsoft Office 12.0 Access e a conexão foi feita com sucesso mas na hora de executar esta dando o erro informado, mesmo alterando para a extensão dom banco para mdb.
Tenta passar o arquivo do seu banco de dados para a versão 2003 (.mdb).
E usa essa string de conexão:
Mostra seu código para realizar a conexão também, assim como o número do erro que irá aparecer, caso essa string de conexão falhe.
Abraços!
E usa essa string de conexão:
Driver={Microsoft Access Driver (*.mdb)};Dbq=C:\seuBancoAqui.mdb;
Mostra seu código para realizar a conexão também, assim como o número do erro que irá aparecer, caso essa string de conexão falhe.
Abraços!
Deu certo mas agora voltou a ocorrer o erro anterior,
Houve um erro durante a gravação dos dados na tabela
se eu desabilitar os erros irá aparecer outro erro que estava dando anteriormente.
Houve um erro durante a gravação dos dados na tabela
se eu desabilitar os erros irá aparecer outro erro que estava dando anteriormente.
Beleza. Primeiro passo concluÃdo! Fizemos a conexão com o banco de dados.
Agora vamos ver como você está gravando os dados.
Tá usando o método Execute do Adodb.Connection com Insert Into?
Posta o código aà da subrotina e mostra exatamente em que linha tá dando o erro. Assim fica mais fácil te ajudar.
Agora vamos ver como você está gravando os dados.
Tá usando o método Execute do Adodb.Connection com Insert Into?
Posta o código aà da subrotina e mostra exatamente em que linha tá dando o erro. Assim fica mais fácil te ajudar.
Segue o código:
Private Sub txtCodUsuario_LostFocus()
Private Sub txtCodUsuario_LostFocus()
Dim cnnComando As New ADODB.Command
Dim rsSelecao As New ADODB.Recordset
[ô]Verifica se foi digitado um Código válido-
[ô]Verifica se foi digitado um código válido:
If Val(txtCodUsuario.Text) = 0 Then
MsgBox [Ô]Não foi digitado um código válido, verifique.[Ô], vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Erro[Ô]
Exit Sub
End If
[ô]o comando abaixo transforma o cursor do mouse em ampulheta-
Screen.MousePointer = vbHourglass
With cnnComando
.ActiveConnection = cnnbiblio
.CommandType = adCmdText
[ô]Monta o comando Select para selecionar o registro na tabela:
.CommandText = [Ô]Select * from Usuarios where CodUsuario=[Ô] & txtCodUsuario.Text & [Ô];[Ô]
Set rsSelecao = .Execute
End With
With rsSelecao
If .EOF And .BOF Then [ô]verifica o inicio e final do registro-
[ô]Se o recordset esta vazio, não retornou registro com esse código:
LimparDados
[ô]Identifica a operação como inclusão:
vInclusao = True
Else
[ô]Senão, atribui aos campos os dados do registro:
txtNomeUsuario.Text = !NomeUsuario
txtEndereco.Text = !Endereco
txtCidade.Text = !Cidade
txtEstado.Text = !Estado
txtCEP.Text = !CEP
txtTelefone = Empty & !Telefone
[ô]Identifica a operação como Alteração:
vInclusao = True
[ô]Habilita o botão Excluir:
Toolbar1.Buttons(3).Enabled = True
End If
End With
[ô]Desabilita a digitação do campo código:
txtCodUsuario.Enabled = False
Saida:
[ô]Elimina o command e o recordset da mémoria:
Set rsSelecao = Nothing
Set cnnComando = Nothing
Screen.MousePointer = vbDefault [ô]volta o ponteiro normal do mouse
Exit Sub
errSelecao:
With Err
If .Number <> 0 Then
MsgBox [Ô]Houve um erro na recuperação do registro solicitado.[Ô], vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Aviso[Ô]
.Number = 0
GoTo Saida
End If
End With
End Sub
Private Sub GravarDados()
Dim cnnComando As New ADODB.Command
Dim vConfMsg As Integer
Dim vError As Boolean
On Error GoTo errGravacao
[ô]Inicializa as variáveis auxiliares:
vConfMsg = vbExclamation + vbOKOnly + vbSystemModal
vErro = False
[ô]Verifica os dados digitados:
If txtNomeUsuario.Text = Empty Then
MsgBox [Ô]O nome não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtEndereco.Text = Empty Then
MsgBox [Ô]O endereco não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtCidade.Text = Empty Then
MsgBox [Ô]A cidade não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtEstado.Text = Empty Then
MsgBox [Ô]O estado não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtCEP.Text = Empty Then
MsgBox [Ô]O cep não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
[ô]Se aconteceu um erro de digitação, sai da sub sem gravar:
If vErro Then Exit Sub
Screen.MousePointer = vbHourglass
With cnnComando
.ActiveConnection = cnnbiblio
.CommandType = adCmdText
[ô]Verifica a operação e cria o comando SQL correspondente:
If vInclusao = True Then
[ô]Inclusão:
.CommandText = [Ô]insert into Usuarios[Ô] & [Ô](CodUsuario,NomeUsuario,Endereco,Cidade,[Ô] & [Ô]Estado,CEP,Telefone)values ( [Ô] & txtCodUsuario.Text & [Ô],[ô][Ô] & txtNomeUsuario.Text & [Ô][ô],[ô][Ô] & txtEndereco.Text & [Ô][ô],[ô][Ô] & txtCidade.Text & [Ô][ô],[ô][Ô] & txtEstado.Text & [Ô][ô],[ô][Ô] & txtCEP.Text & [Ô][ô],[ô][Ô] & txtTelefone.Text & [Ô][ô]);[Ô]
Else
[ô]Alteração:
.CommandText = [Ô]update Usuarios set [Ô] & [Ô]NomeUsuario = [ô][Ô] & txtNomeUsuario.Text & [Ô][ô],[Ô] & [Ô]Endereco = [ô],[Ô] & txtEndereco.Text & [Ô][ô],[Ô] & [Ô]Cidade = [ô],[Ô] & txtCidade.Text & [Ô][ô],[Ô] & [Ô]Estado = [ô],[Ô] & txtEstado.Text & [Ô][ô],[Ô] & [Ô]CEP = [ô],[Ô] & txtCEP.Text & [Ô][ô],[Ô] & [Ô]Telefone = [ô],[Ô] & txtTelefone.Text & [Ô][ô] [Ô] & [Ô]where CodUsuario = [Ô] & txtCodUsuario.Text & [Ô];[Ô]
End If
.Execute
End With
MsgBox [Ô]Gravaçao concluÃda com sucesso.[Ô], vbApplicationModal + vbInformation + vbOKOnly, [Ô]Gravação OK[Ô]
[ô]Chama a sub que limpa os dados do formulário:
LimparTela
Saida:
Screen.MousePointer = vbDefault
Set cnnComando = Nothing
Exit Sub
errGravacao:
With Err
If .Number <> 0 Then
MsgBox [Ô]Houve um erro durante a gravação dos dados na tabela.[Ô], vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Erro[Ô]
.Number = 0
GoTo Saida
End If
End With
End Sub
O erro aparece ao gravar os dados:Houve um erro durante a gravação dos dados na tabela
Se desabilitar no toggle os erros, aparece o erro na linha:
Set rsSelecao = .Execute
Private Sub txtCodUsuario_LostFocus()
Private Sub txtCodUsuario_LostFocus()
Dim cnnComando As New ADODB.Command
Dim rsSelecao As New ADODB.Recordset
[ô]Verifica se foi digitado um Código válido-
[ô]Verifica se foi digitado um código válido:
If Val(txtCodUsuario.Text) = 0 Then
MsgBox [Ô]Não foi digitado um código válido, verifique.[Ô], vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Erro[Ô]
Exit Sub
End If
[ô]o comando abaixo transforma o cursor do mouse em ampulheta-
Screen.MousePointer = vbHourglass
With cnnComando
.ActiveConnection = cnnbiblio
.CommandType = adCmdText
[ô]Monta o comando Select para selecionar o registro na tabela:
.CommandText = [Ô]Select * from Usuarios where CodUsuario=[Ô] & txtCodUsuario.Text & [Ô];[Ô]
Set rsSelecao = .Execute
End With
With rsSelecao
If .EOF And .BOF Then [ô]verifica o inicio e final do registro-
[ô]Se o recordset esta vazio, não retornou registro com esse código:
LimparDados
[ô]Identifica a operação como inclusão:
vInclusao = True
Else
[ô]Senão, atribui aos campos os dados do registro:
txtNomeUsuario.Text = !NomeUsuario
txtEndereco.Text = !Endereco
txtCidade.Text = !Cidade
txtEstado.Text = !Estado
txtCEP.Text = !CEP
txtTelefone = Empty & !Telefone
[ô]Identifica a operação como Alteração:
vInclusao = True
[ô]Habilita o botão Excluir:
Toolbar1.Buttons(3).Enabled = True
End If
End With
[ô]Desabilita a digitação do campo código:
txtCodUsuario.Enabled = False
Saida:
[ô]Elimina o command e o recordset da mémoria:
Set rsSelecao = Nothing
Set cnnComando = Nothing
Screen.MousePointer = vbDefault [ô]volta o ponteiro normal do mouse
Exit Sub
errSelecao:
With Err
If .Number <> 0 Then
MsgBox [Ô]Houve um erro na recuperação do registro solicitado.[Ô], vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Aviso[Ô]
.Number = 0
GoTo Saida
End If
End With
End Sub
Private Sub GravarDados()
Dim cnnComando As New ADODB.Command
Dim vConfMsg As Integer
Dim vError As Boolean
On Error GoTo errGravacao
[ô]Inicializa as variáveis auxiliares:
vConfMsg = vbExclamation + vbOKOnly + vbSystemModal
vErro = False
[ô]Verifica os dados digitados:
If txtNomeUsuario.Text = Empty Then
MsgBox [Ô]O nome não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtEndereco.Text = Empty Then
MsgBox [Ô]O endereco não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtCidade.Text = Empty Then
MsgBox [Ô]A cidade não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtEstado.Text = Empty Then
MsgBox [Ô]O estado não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
If txtCEP.Text = Empty Then
MsgBox [Ô]O cep não foi preenchido.[Ô], vConfMsg, [Ô]Erro[Ô]
vErro = True
End If
[ô]Se aconteceu um erro de digitação, sai da sub sem gravar:
If vErro Then Exit Sub
Screen.MousePointer = vbHourglass
With cnnComando
.ActiveConnection = cnnbiblio
.CommandType = adCmdText
[ô]Verifica a operação e cria o comando SQL correspondente:
If vInclusao = True Then
[ô]Inclusão:
.CommandText = [Ô]insert into Usuarios[Ô] & [Ô](CodUsuario,NomeUsuario,Endereco,Cidade,[Ô] & [Ô]Estado,CEP,Telefone)values ( [Ô] & txtCodUsuario.Text & [Ô],[ô][Ô] & txtNomeUsuario.Text & [Ô][ô],[ô][Ô] & txtEndereco.Text & [Ô][ô],[ô][Ô] & txtCidade.Text & [Ô][ô],[ô][Ô] & txtEstado.Text & [Ô][ô],[ô][Ô] & txtCEP.Text & [Ô][ô],[ô][Ô] & txtTelefone.Text & [Ô][ô]);[Ô]
Else
[ô]Alteração:
.CommandText = [Ô]update Usuarios set [Ô] & [Ô]NomeUsuario = [ô][Ô] & txtNomeUsuario.Text & [Ô][ô],[Ô] & [Ô]Endereco = [ô],[Ô] & txtEndereco.Text & [Ô][ô],[Ô] & [Ô]Cidade = [ô],[Ô] & txtCidade.Text & [Ô][ô],[Ô] & [Ô]Estado = [ô],[Ô] & txtEstado.Text & [Ô][ô],[Ô] & [Ô]CEP = [ô],[Ô] & txtCEP.Text & [Ô][ô],[Ô] & [Ô]Telefone = [ô],[Ô] & txtTelefone.Text & [Ô][ô] [Ô] & [Ô]where CodUsuario = [Ô] & txtCodUsuario.Text & [Ô];[Ô]
End If
.Execute
End With
MsgBox [Ô]Gravaçao concluÃda com sucesso.[Ô], vbApplicationModal + vbInformation + vbOKOnly, [Ô]Gravação OK[Ô]
[ô]Chama a sub que limpa os dados do formulário:
LimparTela
Saida:
Screen.MousePointer = vbDefault
Set cnnComando = Nothing
Exit Sub
errGravacao:
With Err
If .Number <> 0 Then
MsgBox [Ô]Houve um erro durante a gravação dos dados na tabela.[Ô], vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Erro[Ô]
.Number = 0
GoTo Saida
End If
End With
End Sub
O erro aparece ao gravar os dados:Houve um erro durante a gravação dos dados na tabela
Se desabilitar no toggle os erros, aparece o erro na linha:
Set rsSelecao = .Execute
Primeira dica:
Só abra a conexão quando realmente for usar.. e depois a feche.
Exemplo:
conexao.Open...
GravarRegistro()
conexao.Close
Isso evita problemas de conexão ociosa e também é uma boa prática, até porque não deixa o seu aplicativo nem o SGBD usando recursos desnecessários.
Agora vamos ao seu problema.
Essa sua mensagem de erro está acontecendo porque você colocou um tratamento de erro aÃ. Então, toda vez que acontece o erro, seja qual ele for, vai aparecer essa mensagem. Uma dica é usar a descrição do erro pra deixar o problema mais visÃvel.
Para isso, troque a linha:
Por
E aà me fala a mensagem que vai aparecer. Assim vamos saber exatamente o que está acontecendo.
Você chegou a debugar o programa pra saber exatamente em que linha está sendo capturado o erro? Use um breakpoint para isso.
Antes da linha:
Coloque isso:
E veja a mensagem que vai retornar. Veja se sua Query não tá com nenhum parâmetro inconsistente (um valor vazio, digitação errada, etc).
Se fosse pra apostar, eu diria que o problema deve tá na sua instrução SQL. Mas pra ter certeza, me passa a mensagem do erro e a mensagem do CommandText.
Só abra a conexão quando realmente for usar.. e depois a feche.
Exemplo:
conexao.Open...
GravarRegistro()
conexao.Close
Isso evita problemas de conexão ociosa e também é uma boa prática, até porque não deixa o seu aplicativo nem o SGBD usando recursos desnecessários.
Agora vamos ao seu problema.
Essa sua mensagem de erro está acontecendo porque você colocou um tratamento de erro aÃ. Então, toda vez que acontece o erro, seja qual ele for, vai aparecer essa mensagem. Uma dica é usar a descrição do erro pra deixar o problema mais visÃvel.
Para isso, troque a linha:
MsgBox [Ô]Houve um erro durante a gravação dos dados na tabela.[Ô], vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Erro[Ô]
Por
MsgBox [Ô]Houve um erro durante a gravação dos dados na tabela.[Ô] & .Description, vbExclamation + vbOKOnly + vbApplicationModal, [Ô]Erro[Ô]
E aà me fala a mensagem que vai aparecer. Assim vamos saber exatamente o que está acontecendo.
Você chegou a debugar o programa pra saber exatamente em que linha está sendo capturado o erro? Use um breakpoint para isso.
Antes da linha:
.Execute
Coloque isso:
Msgbox .CommandText
E veja a mensagem que vai retornar. Veja se sua Query não tá com nenhum parâmetro inconsistente (um valor vazio, digitação errada, etc).
Se fosse pra apostar, eu diria que o problema deve tá na sua instrução SQL. Mas pra ter certeza, me passa a mensagem do erro e a mensagem do CommandText.
Alterei os campos informados e quando digito o código o usuário aparece um erro na linha:
Set rsSelecao = .Execute
Desabilitando o toggle verifiquei que a inclusão esta falso, neste caso esta identificando que é para ser feita alteração
Set rsSelecao = .Execute
Desabilitando o toggle verifiquei que a inclusão esta falso, neste caso esta identificando que é para ser feita alteração
E a descrição do erro, qual é? Expressão SQL inválida? Sem saber exatamente a mensagem do erro, o máximo que posso fazer é chutar algumas possibilidades. Qual o número do erro?
Tenta assim:
.CommandText = [Ô]Select * from Usuarios where CodUsuario=[Ô] & VAL(txtCodUsuario.Text)
Se isso funcionar, significa que você tava passando um parâmetro nulo pra consulta.
Tenta assim:
.CommandText = [Ô]Select * from Usuarios where CodUsuario=[Ô] & VAL(txtCodUsuario.Text)
Se isso funcionar, significa que você tava passando um parâmetro nulo pra consulta.
Fiz a alteração, mas quando executo o projeto verifiquei que ele não esta cadastrando e sim alterando, a mensagem que aparece quando tento salvar o usuário em questão é o comando update
Com o toggle on error habilitado aparece o seguinte erro: runtime error [ô]-2147217900(80040e14)
microsoft driver odbc para microsoft access parâmetros insuficientes. eram esperados 1
Quando clico em debug, para exatamente na linha: Set rsSelecao = .Execute, em amarelo
rsSelecao =<object variable or with block variable not set>
E agora deixo o toggle on error habilitado ou deixo rodar normal ?
Com o toggle on error habilitado aparece o seguinte erro: runtime error [ô]-2147217900(80040e14)
microsoft driver odbc para microsoft access parâmetros insuficientes. eram esperados 1
Quando clico em debug, para exatamente na linha: Set rsSelecao = .Execute, em amarelo
rsSelecao =<object variable or with block variable not set>
E agora deixo o toggle on error habilitado ou deixo rodar normal ?
Tópico encerrado , respostas não são mais permitidas