Ir para conteúdo
Fórum Script Brasil
  • 0

Ado - Dúvida


Musashi_RS

Pergunta

Olá, estou com uma dúvida para acesso a dados com ADO.

Eu declarei em um Módulo a variável:

Global BD As ADODB.Connection

Depois, em um formulário, na GERAL eu declarei:

Dim WithEvents TB As ADODB.Recordset

E no evento Form_Load desse form, eu coloquei:

Private Sub Form_Load()

Set BD = New ADODB.Connection

BD.CursorLocation = adUseClient

BD.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Banco.mdb;Persist Security Info=False"

BD.Open

Set TB = New ADOR.Recordset

TB.Open "SELECT Nome, Endereco, Bairro, Cidade, CEP, Estado, Fone FROM TClientes ORDER BY Nome", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\Banco.mdb;Persist Security Info=False", adOpenStatic, adLockOptimistic

ExibirDados

End Sub

No entanto, na apostila que estou estudando, em algun dos outros forms não tem a instrução "BD.Open".

Pergunto: quando devo usá-la? E para que ela serve realmente?

Obrigado. :D

Editado por Musashi_RS
Link para o comentário
Compartilhar em outros sites

Posts Recomendados

  • 0

beleza Macêdo, ahco que isso vai resolver meu caso, pois esse volume de registros não irão envolver inclusão ou exclusão. É só pra consulta mesmo.

Eu estva evitando ao máximo usar esse tipo componente para acesso a adados, mas acho que neste caso não haverá problema.

Mas se houver um jeito via código, eu gostaria de saber.

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0

cara, só precisa dessa linha mesmo e mais nd. pelo q sei o DataGrid não tem esse bug não e não tem porque isso não funcionar pra você.

as unicas coisas q acho possiveis de estarem acontecendo é q o seu recordset esta mesmo vazio, ou o seu programa não esta passando pela linha Set DataGrid1.Datasourse = rs por algum motivo, de uma verificada.

EDITADO:

não apareceu nem os nomes dos campos na primeira linha??

Editado por kuroi
Link para o comentário
Compartilhar em outros sites

  • 0

Macêdo,

Só tem um problema, quando eu abria o recordset via código, eu conseguia exibir os seus campos nos TextBox do form (Text1.text = Tabela!Campo). Só que agora que não estou abrindo o recordset via código, eu não consigo exibir os dados onde o cursor parou. O grid preenche conforme a consulta SQL, mas não sei como exibir os dados nas caixas de texto.

Kuroi,

Cara, eu não entendo por que não preenche o grid. Olha o código:

Set TBSemi = New ADODB.Recordset
     TBSemi.Open SQL, CNN, adOpenStatic, adLockOptimistic
     
     Set DataGrid1.DataSource = TBSemi
     
     ExibirDados

Nesse caso, o recordset não está vazio, pois consigo exibir os dados de onde o cursor parou, nas caixas de texto. No entanto, a grade nem se mexe. A conexão com o banco já está aberta no Form_Load, o objeto connection está declarado como público no módulo, e na rotina de pesquisa eu abro o recordset (TBSemi), como visto no código acima. :blink:

Link para o comentário
Compartilhar em outros sites

  • 0

achei aqui, o problema ta na linha

TABELA.Open "SELECT * FROM TAluno WHERE Tipo LIKE '%" & PESQ & "%'", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\DB.mdb;Persist Security Info=False", adOpenStatic, adLockOptimistic
acho q é porque você não ta com uma conexao ativa. olha q ta passando a conexao por string, e não o objeto de conexao q você abriu. acredito q o RecordSet se conecta apenas pra fazer o Select mas não mantem a conexao depois de executado, por isso o grid, acredito q não aceita a listagem. em vez de passar a string, passa a conexao, q alias q abre mas não utiliza. tipo assim:
TABELA.Open "SELECT * FROM TAluno WHERE Tipo LIKE '%" & PESQ & "%'", BANCO, adOpenStatic, adLockOptimistic

Link para o comentário
Compartilhar em outros sites

  • 0

Show de bola! :lol: Então o certo, para qualquer grid ou campo a ser preenchido, é sempre abrir o recordset com o objeto da conexão ativa? :lol:

Bah, eu nunca iria desconfiar, pois no livro eu que estava estudando, o recordset era aberto com uma string, repetindo a ConnectionString passada na abertura do banco, da mesma forma que eu te passei no projeto.

beleza então.

Muito obrigado. ;)

Link para o comentário
Compartilhar em outros sites

  • 0

Posso aproveitar esse tópico ainda para outra dúvida ou é melhor criar outro?

Quando eu gravo ou deleto um registro via ADO, para que eu possa atializar um combo de nomes, por exemplo, é preciso abrir o recordset outra vez, ou eu posso simplesmente percorrer o recordset?

'Grava o registro

rs.Update

AbreRecordset

'Percorre o recordset

rs.MoveLast

rs.MoveFirst

PreencheCombo

PS. Não quiz colocar o código para preencher um combo.

Outra dúvida: O que exatamente a instrução Set rs = New ADODB.Recordset faz? Tipo, sei que ele inicializa o objeto recordset, mas quero saber se preciso fazê-lo a cada pesquisa. E outra, depois de uma pesquisa, eu não estou fechando o recordset (Set rs = Nothing). Só fecho quando saio do form de consulta. Estou fazendo certo?

Vlw

Editado por Musashi_RS
Link para o comentário
Compartilhar em outros sites

  • 0

como a duvida é basicamente sobre o mesmo assunto, podemos continuar nesse tópico mesmo.

o q acontece é o seguinte. cada vez q você faz um select, os dados são trazidos para a memoria. o recordset passa a acessar a memoria e não o banco de dados. qualquer alteracao q você faca no banco vai alterar o banco mas não a memoria.

você teria q fazer outro select (pegar de novo do banco pra gravar na memoria). o MoveLast seguido do MoveFirst não vai influenciar em nd. alias só vai fazer você perder tempo de processamento, já q o q esta na memoria vai continuar como está.

a solucao é abrir novamente o recordset mesmo. e ai você teria q limpar o combo e carregar os dados novamente.

quanto ao Set rs = New ADODB.Recordset só é necessario usar alguma vez. a não ser q você use o Set rs = Nothing.

é o seguinte. ao inicializar o RecordSet você pode utiliza-lo normalmente. mas quando você seta o Nothing pra ele, você esta destruindo o RecordSet. e só vai pode utiliza-lo se inicializa-lo de novo. deu pra entneder??

Link para o comentário
Compartilhar em outros sites

  • 0
Hmmm, entendi. Eu estava usando o set rs = Nothing em conjunto com o rs.close..

O último não "destroi" o recordset então?

vlw

não, o close só fecha o recordset, e só no caso de ele estar aberto (com registros), ele vai fechar a consulta atual, mas o recordset continua utilizavel.

Link para o comentário
Compartilhar em outros sites

  • 0
Desculpe a ignorancia, mas estou tendo que utilizar o Set rs = New ADODB.Recordset em todas as queries, inclusive sem usar o Close. Não é estranho? O.o

é sim, mas pra fazer o select, você ta usando o metodo Open do RecordSet ou ta usando o esquema do Set rs = cn.Execute(sql)??

porque se você tiver usando o metodo Open, você tem sim q usar o Close antes de abrir (ou fazer como você faz, Set rs = New ADODB.RecordSet), porque se não me engano, ele não consegue abrir um RecordSet já aberto. funciona quando você inicializa (ou, no caso, reinicializa) o RecordSet, porque ai todas as propriedades dele voltam pro estado inicial (ou seja, ele ele vai estar fechado).

mas se você tirar a linha Set rs = New ADODB.RecordSet, q erro q da??

se você tiver mesmo usando o metodo Open, acho q é tipo, RecordSet is already open, alguma coisa assim, não??

bom, mas se ta funcionando pra você assim, beleza. mas acredito q ele vai levar mais tempo de processamento inicializando toda hora do q simplesmente fechando antes de abrir.

fora q o mais "bunito" de se fazer, seria fechar antes de abrir de novo.

se você ta mesmo usando o metodo Open, pode checar se ele ta aberto ou não pela propriedade State. se não me engano, quando tiver aberto, o State retorna 1. ai nesse caso, você checa se é 1, se for você fecha, senao não.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,1k
    • Posts
      651,8k
×
×
  • Criar Novo...