Ir ao conteúdo
  • Cadastre-se

Visual Basic 6.0 - Conexão


poulain

Posts recomendados

Boa Tarde ^_^

Estou com um projeto, e coloquei o código abaixo em um Módulo:


Option Explicit

Public cnnbase As ADODB.Connection
Public rs As ADODB.Recordset
Public strconn2000 As String
Public strconn2003 As String
Public SQL As String

Public Sub AbrirConexao(Banco As String)
strconn2000 = "Provider=microsoft.jet.oledb.3.51;data source=" & Banco
strconn2003 = "Provider=microsoft.jet.oledb.4.0;data source=" & Banco
Set cnnbase = New ADODB.Connection
cnnbase.ConnectionString = strconn2003
cnnbase.Open
End Sub

Public Function ExecutarRecordset(Comando As String, Tipo As String) As ADODB.Recordset
Dim RecTemp As ADODB.Recordset
Set RecTemp = New ADODB.Recordset
If Tipo = "s" Then
[COLOR="Red"]Set RecTemp = cnnbase.Execute(Comando)[/COLOR]
Else
cnnbase.Execute (Comando)
Set RecTemp = Nothing
End If
Set ExecutarRecordset = RecTemp
End Function

A linha em vermelho é onde está dando erro ao executar o programa.

O erro que aaprece é:

Run-time error '91'

Object variable or Witch block variable not set

Alguém poderia me ajudar?

Obrigada.

Link para o comentário
Compartilhar em outros sites

Hummm...

Eu dei uma modificada no código, mas acredito que estou me confundindo na hora de puxar o recordset oO'

Tenho um banco que se chama cadastro.mdb e nele tem a tabela clientes, que tem os campos Nome, Rua, Número, Bairro, Cidade, Nascimento. (nenhum deles é chave primária, e todos estão como formato de texto).

E no Form tenho os texts txt_nome, txt_rua, txt_num, txt_bai, txt_cid, txt_nasc.

Vou recolocar o código do módulo, pois fiz algumas alterações:


Option Explicit
Public cnnBase As ADODB.Connection
Public RS As ADODB.Recordset
Public STRconn2000 As String
Public STRconn2003 As String
Public SQL As String


[COLOR="Blue"]Public Sub AbrirConexao(Banco As String)[/COLOR]
STRconn2000 = "Provider=Microsoft.Jet.OLEDB.3.51;Fata Source=" & Banco
STRconn2003 = "Provider=Microsoft.Ket.OLEDB.4.0;Data Source=" & Banco
Set cnnBase = New ADODB.Connection
cnnBase.ConnectionString = STRconn2003
cnnBase.Open
[COLOR="Blue"]End Sub[/COLOR]

[COLOR="Blue"]Public Function ExecutarRecordset(Comando As String, Tipo As String) As ADODB.Recordset[/COLOR]
Dim RecTemp As ADODB.Recordset
Set RecTemp = New ADODB.Recordset
If Tipo = "S" Then
[COLOR="Red"]Set RecTemp = cnnBase.Execute(Comando)[/COLOR] [COLOR="SeaGreen"]'ao clicar no botão Inserir do form
(código abaixo) dá erro nesta linha do módulo, agora
mostrando o erro [B]"O comando de texto não foi
definido para o objeto de comando"[/B] e ainda no Debug
coloco o mouse sobre (Comando) aparece [B]Comando=""[/B]
creio que não estou puxando corretamente o recordset ou o abrirbranco.[/COLOR]
Else
Set RecTemp = Nothing
End If
Set ExecutarRecordset = RecTemp
[COLOR="Blue"]End Function[/COLOR]

Agora, no Form tenho o código do Form_Load e o cmd_inserir:


[COLOR="Blue"]Private Sub cmd_inserir_Click()[/COLOR]
Set RecTemp = ExecutarRecordset(SQL, "S") [COLOR="Green"]'aqui seria mesmo (SQL, "S")?[/COLOR]
SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values (" & txt_nome.Text & " , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
cnnBase.Execute (Comando)
[COLOR="Blue"]End Sub[/COLOR]


[COLOR="Blue"]Private Sub Form_Load()[/COLOR]
AbrirConexao ("C:\Paola\cadastro.mdb")

[COLOR="Blue"]End Sub[/COLOR]

:confused: Este é o código do meu programa atualmente...

Obrigada e espero um mãozinha rsrsrs

Link para o comentário
Compartilhar em outros sites

Não está dando erro na "AbrirConexao"? Essa connection string está com erro de digitação "Microsoft.Ket".


STRconn2003 = "Provider=Microsoft.Ket.OLEDB.4.0;Data Source=" & Banco

E aqui você está mandando executar uma instrução que não sei qual é (variável SQL) e depois o insert usando a variavel SQL setada. Acho que você queria fazer só isso aqui:


Private Sub cmd_inserir_Click()
SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values (" & txt_nome.Text & " , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
Set RecTemp = ExecutarRecordset(SQL, "S") 'aqui seria mesmo (SQL, "S")?
End Sub

JP

Link para o comentário
Compartilhar em outros sites

Hummm modifiquei mas agora está dando outro erro, na mesma linha do módulo:

Set RecTemp = cnnBase.Execute(Comando)

Agora aparece assim: Nenhum valor foi fornecido para um ou mais parâmetros necessários, ou aparece erro na sintaxe INSERT INTO.

E quando coloco o mouse sobre (comando) aparece:

Comando = "INSERT INTO clientes (Nome, Rua, Número...

aparece o código inteiro do insert into.

Link para o comentário
Compartilhar em outros sites

heueheueheue

deu certo, não acredito que era algo tão simples como um aspa ... =)

Obrigada!

Agora pra colocar condições no cmd_inserir, por exemplo:

1) Todos os campos devem ser preenchidos, se não forem o label8 fica visivel e aparece a msg "Todos os campos devem ser preenchidos

Eu fiz assim:

Private Sub cmd_inserir_Click()

If txt_nome.Text = "" And txt_rua.Text = "" And txt_num.Text = "" And txt_cid.Text = "" And txt_bai.Text = "" And txt_nasc.Text = "" Then

Label8.Visible = True

Else

SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values ('" & txt_nome.Text & "' , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"

Set RecTemp = ExecutarRecordset(SQL, "S")

End If

End Sub

Mas deu erro naquela mesma linha do módulo, parece que ele ja foi direto pra linha SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, ...

as outras condições que quero e nao sei fazer são:

1) o campo txt_num tem que ser número, se não for o label3 fica visivel e aparece que o campo tem que ser numérico

3) o campo txt_nasc tem que ser data, se não for o label4 fica visivel e aparee que o campo tem que ser data.

Obrigada!!!!!!

Link para o comentário
Compartilhar em outros sites

Que erro dá?

Se você não quer que nenhum dos campos esteja em branco, teste com OR a não com AND. Com AND você está testando se TODOS os campos estão em branco.

Para saber se o campo é numérico, o VB tem uma função IsNumeric(numero):


If Not IsNumeric(txt_num.Text) Then
Label8.Visible = True
Exit Sub
End If

Há algo semelhante para Date também, com a função IsDate(data):


If Not IsDate(txt_nasc.Text) Then
Label4.Visible = True
Exit Sub
End If

JP

Link para o comentário
Compartilhar em outros sites

Deu certo, o código final ficou assim:


Private Sub cmd_inserir_Click()
Label8.Visible = False
Label3.Visible = False
Label9.Visible = False
If txt_nome.Text = "" Or txt_rua.Text = "" Or txt_num.Text = "" Or txt_cid.Text = "" Or txt_bai.Text = "" Or txt_nasc.Text = "" Then
Label8.Visible = True
End If
If Not IsNumeric(txt_num.Text) Then
Label3.Visible = True
Exit Sub
End If
If Not IsDate(txt_nasc.Text) Then
Label9.Visible = True
Exit Sub
End If

SQL = "INSERT INTO clientes (Nome, Rua, Número, Bairro, Cidade, Nascimento) Values ('" & txt_nome.Text & "' , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
Set RecTemp = ExecutarRecordset(SQL, "S")
MsgBox "Registro inserido com sucesso"


End Sub

Por enquanto não estou com dúvidas, se tiver mais eu coloco aqui!!

Obrigada!!! ^_^

Link para o comentário
Compartilhar em outros sites

Ponha o Exit Sub nesse trecho aqui também, senão ele vai tentar fazer o insert, mesmo entre no IF. O Exit Sub força o fim do processamento do Sub, ou seja, não chega até a linha do ExecutarRecordset.


If txt_nome.Text = "" Or txt_rua.Text = "" Or txt_num.Text = "" Or txt_cid.Text = "" Or txt_bai.Text = "" Or txt_nasc.Text = "" Then
Label8.Visible = True
Exit Sub
End If

JP

Link para o comentário
Compartilhar em outros sites

Ok, coloquei e agora está isnerindo certinho^^

Mas agora surgiu outra duvida,

eu criei um menu no form1 e quero que o que eu chamar apareça dentro do form, mas nao lembro se o menu tem que ser no MDI ou no proprio form.

E como puxa o form pra dentro do mdi / vice-versa.

^B)

Link para o comentário
Compartilhar em outros sites

Agora puxa normalmente o form1 dentro do MDI.

^^

Agora criei um FORM2, nele eu coloquei um Text e um List, e dois botões: cmdlistar e cmdok,

O que fiz:

quando clica no cmdlistar, dentro do list aparece todos os nomes do registro,

e quando digita no Text algum nome, e clica no cmdok aparece os registros com aquele nome;

O código abaixo do form2:


Option Explicit
Public RSList As ADODB.Recordset
Public RSText As ADODB.Recordset



Private Sub cmdlistar_Click()
List1.Clear
SQL = "select Nome from clientes"
Set RSList = ExecutarRecordset(SQL, "S")
If RSList.EOF = True Then
MsgBox "nenhum registro"
Else
Do While RSList.EOF = False
List1.AddItem RSList!Nome
RSList.MoveNext
Loop
End If
End Sub

Private Sub cmdok_Click()
List1.Clear
SQL = "select Nome from clientes where Nome = '" & Text1.Text & "'"
Set RSList = ExecutarRecordset(SQL, "S")
If RSList.EOF = True Then
MsgBox "nenhum registro"
Else
Do While RSList.EOF = False
List1.AddItem RSList!Nome
RSList.MoveNext
Loop
End If
End Sub

Private Sub Form_Load()
AbrirConexao ("C:\Paola\cadastro.mdb")
SQL = "select distinct Nome from clientes"
Set RSText = ExecutarRecordset(SQL, "S")
End Sub

O único problema que está dando é que quando se digita "Paola" no Text, apareceque não tem nenhum registro, é necessário digitar o nome completo "Paola Napoli" para aparecer, e eu quero que verifique em qualquer palavra por exemplo:

Para encontrar "Paola Napoli" poderá digitar no text:

Paola

Napoli

pa

ola

poli

etc..

um pedaço do nome, não o nome completo.

Valeu!

Link para o comentário
Compartilhar em outros sites

Era isso mesmo, obrigada!

Agora neste form2, ao dar um duplo clique em algum nome do List, deveria retornar ao form1, com os dados preenchidos do nome que foi clicado no list do Form2, oO'

aii deve usar form1.show, mas nao sei o código que utiliza para saber que vão ser definidos os campos com o que foi clicado no form2...

Link para o comentário
Compartilhar em outros sites

Faça no Form1 uma função que recebe o código do usuário clicado, e chame-a do Form2. Algo +/- assim:

No Form1:


Public Sub ExibeDadosUsuario(ByVal lngCodigo As Long)
... (preenche os campos conforme você quer, baseado nesse código passado por parâmetro) ...
Me.Show
(Acho que é bom por um Me.ZOrder também para ele trazer o form para frente, caso já esteja exibido, mas por baixo do outro)
End Sub

No Form2:


Sub lstXanana_DblClick(Index As Long)
Form1.ExibeDadosUsuario(lstXanana.List(Index)) ' Assumindo que o texto do ListBox é sua chave de procura, que será usada no outro sub
End Sub

JP

Link para o comentário
Compartilhar em outros sites

Vamos ver se entendi,

No Form1 coloquei:


Public Sub ExibeDadosUsuario(ByVal lngCodigo As Long) [COLOR="Green"]'pra que esse lngCodigo?[/COLOR]
SQL = "Update clientes set (Nome, Rua, Número, Bairro, Cidade, Nascimento) where ('" & txt_nome.Text & "' , '" & txt_rua & "' , '" & txt_num.Text & "' , '" & txt_bai.Text & "' , '" & txt_cid.Text & "' , '" & txt_nasc.Text & "')"
Me.Show
Me.ZOrder
End Sub

No Form2:


Private Sub List1_DblClick(Index As Long)
Form1.ExibeDadosUsuario (List1.List(Index))
End Sub

Porém logo ao executar o programa, aparece:

Compile error: Procedure declaration does not match description of event or procedure having the same name

E fica selecionado:

Private Sub List1_dblclick(Index As Long

oO'

Link para o comentário
Compartilhar em outros sites

O "Index" aqui é "integer" e não long. Sorry, não tenho um VB aqui para testar...

Private Sub List1_DblClick(Index As Long)

Mas vai continuar dando erro, porque te passei a solução pensado em passar só um código aqui:

Public Sub ExibeDadosUsuario(ByVal lngCodigo As Long) 'pra que esse lngCodigo?

quando você quer passar todos os dados. Mude os parametros para os conteúdos dos seus textboxes, e daí na instrução SQL pegue os valores dos parâmetros.

Não vou fazer para você porque senão você não vai aprender nada... Estou vendo que você está empacando em cada errinho que dá. Tem que se quebrar um pouco para aprender :)

JP

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...