HOUVE UM ERRO NA CONEXÃO COM O BANCO DE DADOS

JACKTRINTA 05/02/2016 01:31:37
#457109
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.
DS2T 05/02/2016 01:42:27
#457110
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!
JACKTRINTA 05/02/2016 02:09:23
#457114
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.
DS2T 05/02/2016 03:01:23
#457117
Tenta passar o arquivo do seu banco de dados para a versão 2003 (.mdb).
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!

JACKTRINTA 05/02/2016 08:00:45
#457125
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.
DS2T 05/02/2016 08:05:53
#457128
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.
JACKTRINTA 05/02/2016 08:16:27
#457129
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
DS2T 05/02/2016 09:08:47
#457136
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:

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.
JACKTRINTA 05/02/2016 18:24:02
#457186
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
DS2T 06/02/2016 01:19:09
#457226
Resposta escolhida
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.
JACKTRINTA 06/02/2016 09:48:59
#457244
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 ?
Página 1 de 5 [42 registro(s)]
Tópico encerrado , respostas não são mais permitidas