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

o Open serve pra abrir, estabelecer a conexao com o banco de dados. de uma olhada, como a variavel é global, ele vale pro projeto todo. se você seta uma propriedade nela em formulario qualquer, quando você abrir otro formulario, a mudanca q você fez ainda vai estar valendo.

ou seja, se você abrir a conexao uma vez não é necessario abrir de novo a não ser q você feche.

Link para o comentário
Compartilhar em outros sites

  • 0

Então essas instruções eu declaro apenas uma vez?

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

E essas nos outros forms?

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

A pergunta pode ser idiota, mas o formulário inicial, que abriu o BD, precisa ficar aberto? Ou quado esse form é fechado o BD continua aberto?

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0

se a variavel é publica (ou global), o form não precisa ficar aberto não. alias, se ela tivesse sido delcarada so nesse form, ele estando fechado ou aberto, você não conseguiria acessar a conexao em nenhum outro form.

quanto ao recordset, se ele esta declarado no proprio formulario você precisa abri-lo toda vez sim (se declarar como publica no module, não). mas acho q era pra ser ADODB em vez de ADOR, não??

agora pra abrir normalmente se passa a conexao já aberta, tipo assim:

TB.Open "SELECT Nome, Endereco, Bairro, Cidade, CEP, Estado, Fone FROM TClientes ORDER BY Nome", BD, adOpenStatic, adLockOptimistic
alias, o q costuma-se fazer tb é, pra executar as querys, em vez de ficar fechando e abrindo o recordset toda hora, usar o metodo execute da conexao. tiop assim:
Set TB = BD.Execute("Select * From Tabela")

Link para o comentário
Compartilhar em outros sites

  • 0

Cara, agora eu não sei te dizer se o certo é ADOBD ou ADOR, pois esse é um exemplo de um livro. Além disso, o VB permite as duas opções e eu não sei a diferença das duas.

Só pra lembrar, query é uma pesquisa, certo?

Eu poderia utilizar o método execute sem abrir o recordset?

vlw

Link para o comentário
Compartilhar em outros sites

  • 0

Eu denovo. Cara eu estava olhando como estabelecer uma conexão com ADO, recordset também e tal, e me confundi mais ainda. Nessa apostila o autor utiliza o COMMAND ao invés de CONNECTION.

Seria pedir muito que você me mandasse ou postasse aqui a forma correta (e necessária) para:

- estabelecer uma conexão com o banco de dados apenas um vêz;

- "chamar" o recordset corretamente sempre que for necessário;

...É tanta declaração que eu m confundo, por exemplo: no módulo se declara uma variável global pra a conexão com o banco de dados (Global ou public BD as ADODB.connection).

...mas no form também é declarada ou atribuida uma variável para a mesma coisa: (Set BD = New ADOBD.connection).

Não entendo o porquê... :huh:

Link para o comentário
Compartilhar em outros sites

  • 0
Cara, agora eu não sei te dizer se o certo é ADOBD ou ADOR, pois esse é um exemplo de um livro. Além disso, o VB permite as duas opções e eu não sei a diferença das duas.

Só pra lembrar, query é uma pesquisa, certo?

Eu poderia utilizar o método execute sem abrir o recordset?

a esse ADOR é da biblioteca Microsoft ActiveX Data Objects RecordSet. nunca usei essa biblioteca, mas se funcionar ai pode usar sem problemas.

query é qualquer comando SQL, tipo Select, Insert, Update, etc.

pode usar o execute sem abrir sim, mas você deve iniciar o objeto antes. tipo assim:

Set rs = New ADODB.RecordSet
Eu denovo. Cara eu estava olhando como estabelecer uma conexão com ADO, recordset também e tal, e me confundi mais ainda. Nessa apostila o autor utiliza o COMMAND ao invés de CONNECTION. Seria pedir muito que você me mandasse ou postasse aqui a forma correta (e necessária) para: - estabelecer uma conexão com o banco de dados apenas um vêz; - "chamar" o recordset corretamente sempre que for necessário; ...É tanta declaração que eu m confundo, por exemplo: no módulo se declara uma variável global pra a conexão com o banco de dados (Global ou public BD as ADODB.connection). ...mas no form também é declarada ou atribuida uma variável para a mesma coisa: (Set BD = New ADOBD.connection). Não entendo o porquê... :huh:
o objeto Command serve pra executar um comando no RecordSet. mas ele não é necessario, você pode usar sem. ele facilita quando você vai usar Procedures com parametros, etc. nos comandos mais simples normalmente não utilizamos. - pra estabelecer a conexao só uma vez, é só declarar o objeto como Public ou Global no Module e usar o codigo do seu outro post, onde você passa a Connection String e usa o metodo Open. - cara, normalmente, só uso o Execute cada vez q for executar qualquer coisa. e em querys q não retornam nada (como Insert e Update) nem precisa pro RecordSet, pode fazer simplesmente:
BD.Execute "Insert Into Tabela(Campos) Values(Valores)"

não chamo o metodo Open do RecordSet nenhuma vez no programa.

- no module, a conexao esta declarada. mas note q ela não é uma variavel e sim um objeto, e os objetos precisam ser inicializados. pra isso serve o Set BD = New ADOBD.connection. apesar q você pode fazer direto no module: Global ou public BD as New ADODB.connection

Link para o comentário
Compartilhar em outros sites

  • 0

Ok, então como você disse que eu sempre preciso iniciar um objeto, eu posso declarar no módulo o objeto (Public BD as ADOBD.connection) e logo abaixo eu já posso inicializá-lo (Public BD = New ADOBD.connection), ficando assim:

Public DB As ADOBD.connection

Public BD = New ADOBD.connection

É isso?

E quanto ao objeto Command, eu preciso colocar algum parâmetro além de iniciar o objeto recordset (Set RS = New ADOBD.recordset)?

Link para o comentário
Compartilhar em outros sites

  • 0
Ok, então como você disse que eu sempre preciso iniciar um objeto, eu posso declarar no módulo o objeto (Public BD as ADOBD.connection) e logo abaixo eu já posso inicializá-lo (Public BD = New ADOBD.connection), ficando assim:

Public DB As ADOBD.connection

Public BD = New ADOBD.connection

É isso?

não é nd disso... quero dizer, é isso mas tem uns erros. primeiro q o certo é ADODB e não ADOBD. segundo q você declarou o objeto com nome de DB e depois tentou inicializar com o nome de BD. tercero q o Public é usado só na hora de declarar e não pra inicializar. se você quer criar e inicializar de uma vez, seria assim:

Public DB As New ADODB.Connection
E quanto ao objeto Command, eu preciso colocar algum parâmetro além de iniciar o objeto recordset (Set RS = New ADOBD.recordset)?
essa eu não entendi direito. parametro onde?? pra usar o objeto Command, você tem q passar a query pra propriedade CommandText, a conexao pra propriedade ActiveConnection, ai você simplesmente executa assim:
Set RS = Com.Execute

bom ve se era essa mesmo a sua duvida, qualquer coisa posta ae

Link para o comentário
Compartilhar em outros sites

  • 0

OK, as coisas estão se esclarecendo. :lol:

Agora eu entendi porque as vezes eu via o "Public DB As New ADODB.Connection" e não sabia se o objeto estava sendo criado ou inicializado. Eu não sabia que dava pra fazer em um comando só. =P

Resumindo, colocando um "Public DB As New ADODB.Connection" no módulo já é o suficiente?

Depois num formulário eu só declaro a conexão e a query? Ou tem algo mais prático?

Quanto ao command, eu entendi agora.

vlw

Link para o comentário
Compartilhar em outros sites

  • 0

pondo só Public DB As New ADODB.Connection no module resolve sim, mas você tb tem q abrir a conexao depois, ne (passar a connectionstring e acessar o metodo Open).

foi isso q você quis dizer aqui??

Depois num formulário eu só declaro a conexão e a query? Ou tem algo mais prático?

como assim declarar a query?? você fala do recordset??

pode ser tb, mas nd impede de você criar um recordset tb publico.

Link para o comentário
Compartilhar em outros sites

  • 0
pondo só Public DB As New ADODB.Connection no module resolve sim, mas você tb tem q abrir a conexao depois, ne (passar a connectionstring e acessar o metodo Open).

foi isso q você quis dizer aqui??

Depois num formulário eu só declaro a conexão e a query? Ou tem algo mais prático?

como assim declarar a query?? você fala do recordset??

pode ser tb, mas nd impede de você criar um recordset tb publico.

Exatamente, eu estou um pouco perdido para me referir aos objetos e tal, mas a gente se entende.

Eu estva ciente que eu preciso abrir a conexão depois, lá no form. E quanto a minha pergunta sobre query, eu me referia sim ao recordset. :P

Bom, tu disse que eu também posso declarar a "abertura do recordset" (não sei como chamar) no módulo? Você quer dizer, como criar uma rotina pública (Public sub) com a abertura da conexão e tambéma abertura do recordset? Isso é melhor?

Outra dificuldade minha é na hora da pesquisa: digamos que eu declare tudo público (abertura da conexão e recordset) dentro de uma Publix sub no módulo chamada Abrir. Depois, eu chamo a rotina Abrir no evento Form_Load do formulário, estabelecendo a conexão e abrindo o recordset. Até aí tudo bem?

Então, se eu quiser realizar uma pesquisa via SQL, eu preciso chamar a rotina abrir outra vêz no evento BotãoPesquisa_Click, por exemplo? Como se faz? :huh:

Vlw :lol:

Link para o comentário
Compartilhar em outros sites

  • 0
Bom, tu disse que eu também posso declarar a "abertura do recordset" (não sei como chamar) no módulo? Você quer dizer, como criar uma rotina pública (Public sub) com a abertura da conexão e tambéma abertura do recordset? Isso é melhor?

quis dizer q você pode declarar e inicializar o RecordSet no proprio Module tipo assim:

Dim rs As New ADODB.RecordSet
mas você tb pode fazer essa sua funcao sem problemas.
Outra dificuldade minha é na hora da pesquisa: digamos que eu declare tudo público (abertura da conexão e recordset) dentro de uma Publix sub no módulo chamada Abrir. Depois, eu chamo a rotina Abrir no evento Form_Load do formulário, estabelecendo a conexão e abrindo o recordset. Até aí tudo bem? Então, se eu quiser realizar uma pesquisa via SQL, eu preciso chamar a rotina abrir outra vêz no evento BotãoPesquisa_Click, por exemplo? Como se faz? :huh:
você só chamaria ela uma vez (no Form_Load, pode ser). e ela seria só pra abrir a conexao e não o recordset (pode ser tb o recordset mas não tem necessidade). uma vez aberta a conexao, a não ser q você use o metodo Close alguma hora no seu programa, ela vai ficar aberta ate quando o programa for fechado (nesse caso tb é de costume fechar a conexao e todos os objetos abertos no Unload do form principal - ou seja, quando é encerrada a execucao do programa - pra liberar a memoria). como eu disse, o RecordSet ou você usa o comando Open cada vez q for executar um SQL e depois fecha, ou não precisa abrir nunca, somente executar com o execute da conexao (ou do command). tipo assim:
Set rs = cn.Execute(sql)
ou
Set rs = cm.Execute

onde cn é um objeto Connection e cm um Command.

Link para o comentário
Compartilhar em outros sites

  • 0

Show, fui testar ontem e, agora que estou vendo o post, vi que fiz bem isso mesmo. Agora entendi essa parte de conexão com o banco e do recordset. :lol:

Porém, como eu disse, ontem fui testar o que discutimos aqui, e vi que para chamar um recordset no MS Flex Grid via código, isto é, sem usar o componente ADO DATA Control, o processo é super lento! (em torno de 1 minuto) Deve haver uma maneira de chamar na mesma velocidade que o componente chama, senão não tem condições... :o

Eu fiz o que você disse acima, declarei e inicialize o o objeto connection e apenas declarei o objeto recordset no modulo, pois não precisava inicializá-lo logo no inicio. Isso tudo utilizando aquela rotina "Abrir".

Fui fazer o teste para preencher um MS Flex Grid com todos os registross da tabela (20 mil) e foi uma lerdesa só. Eu pergunto porque quando eu utilizo o componente ADO Data Control, ele chama e preenche super rápido.

Você sabe o que pode ser?

Vlw :rolleyes:

Link para o comentário
Compartilhar em outros sites

  • 0
Fui fazer o teste para preencher um MS Flex Grid com todos os registross da tabela (20 mil) e foi uma lerdesa só. Eu pergunto porque quando eu utilizo o componente ADO Data Control, ele chama e preenche super rápido.

Você sabe o que pode ser?

hum, acredito q foi o q eu acabei de postar no otro tópico. como esta o codigo onde ele preenche o Flex Grid?? você esta alterando pela propriedade TextMatrix linha por linha, coluna por coluna, certo?? se for isso, é normal q ele demore já q ele vai estar executando varias linhas de codigo durante o processo todo.

Link para o comentário
Compartilhar em outros sites

  • 0

É exatamente, depois de chamar o recordset, é iniciado um loop que vai até o ultimo registro gerado no recordset. Eu já imaginava que era por isso que demora tanto. O código está assim:

Private Sub BtnPesq1_Click()
  Dim SQL As String
  
  Set TABELA = Nothing
  SQL = InputBox("Informe uma Query:", "Pesquisa SQL")

  If SQL = "" Then Exit Sub
  
  
  TABELA.Open SQL, CNN, adOpenStatic, adLockOptimistic
  
  'FormataGrade
  Grade.Row = 1
  Do Until TABELA.EOF
     With Grade
        .Cols = 7
        .Row = .Row + 1
        .Row = .Rows - 1
        .TextMatrix(.Row, 1) = TABELA.Fields("Tipo")
        .TextMatrix(.Row, 2) = TABELA.Fields("Caracteristica")
        .TextMatrix(.Row, 3) = TABELA.Fields("Descricao")
        .TextMatrix(.Row, 4) = TABELA.Fields("Terminal")
        .TextMatrix(.Row, 5) = TABELA.Fields("Envolucro")
        .TextMatrix(.Row, 6) = TABELA.Fields("Equivalente")
        TABELA.MoveNext
     End With
     
     LblTotal = TABELA.AbsolutePosition
     LblTotal.Refresh
  Loop
  If Grade.Rows - 1 > 0 Then
     Grade.Row = 1
  End If
  
End Sub
Porém, no outro Tópico você postou um comando que eu acho que vai resolver o meu problema.
Set MSHFlexGrid1.DataSource = rs

Se eu colocar esse comando, eu não precisarei preencher a grade via Textmatrix, linha por linha em um loop? diz que sim, diz que sim.

Se puder me mostrar como fica o código eu agradeço.

Vlw

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

  • 0
Porém, no outro Tópico você postou um comando que eu acho que vai resolver o meu problema.

Set MSHFlexGrid1.DataSource = rs

Se eu colocar esse comando, eu não precisarei preencher a grade via Textmatrix, linha por linha em um loop? diz que sim, diz que sim.

Se puder me mostrar como fica o código eu agradeço.

se você quer tanto eu digo q sim. com esse comando ele preenche o grid todo de uma vez. mas so funciona com um dataset DAO. pra um dataset (ou recordset) ADO, você tem q usar o Hierarchical Flex Grid. o codigo é exatamente como eu passei, onde MSHFlexGrid1 é o nome do seu grid e rs o nome do seu recordset.

Link para o comentário
Compartilhar em outros sites

  • 0

Cara, eu testei com o MS Hierarchical Flex Grid, como você disse, e preencheu penas um linha. Mesmo que eu formate a grade antes, como por exemplo colocar o número de línhas = ao recordcount do recordset, ele retorna em apenas uma linha. E também não entendo por que o recordcount é ihual a -1 sempre. :huh:

falou

Link para o comentário
Compartilhar em outros sites

  • 0

cara, pra o seu grid ficar só com uma linha a unica coisa q me vem na cabeca é q o seu select só retorna um registro mesmo.

e quanto ao RecordCount, isso é problema de permissao, já foi comentado aqui: http://scriptbrasil.com.br/forum/index.php?showtopic=107398

antes de abrir sua conexao, adicione a linha:

cn.CursorLocation = adUseClient

Link para o comentário
Compartilhar em outros sites

  • 0

Deu certo! Kuroi :lol:

O problema era de interface mesmo... ¬¬ Eu havia declarado uma variável CNN como string para guardar a conexão apenas uma vez, para depois usar somente a variável CNN. Porém eu não me liguei que não havia declarado a variável como publica. :P

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0

Poxa, não sei o que está acontecendo, de repente o MSH Flex Grid não está mais preenchendo por completo. Tipo, eu chamo a consulta, o RecordCount do recordset confirma o número total, ou seja, está correto, mas na grade ele só preenche até a linha 2048.

Por que será? :blink:

segue o código inteiro:

Option Explicit
Public BANCO As ADODB.Connection
Public TABELA As ADODB.Recordset


Private Sub Form_Load()
  Set BANCO = New ADODB.Connection
  BANCO.CursorLocation = adUseClient
  BANCO.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\IPR\DB\DB.mdb;Persist Security Info=False"
  BANCO.Open
  
  Set TABELA = New ADODB.Recordset
  TABELA.Open "SELECT * FROM Tsemi WHERE Tipo LIKE '%B%' ORDER BY Tipo", "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & App.Path & "\IPR\DB\DB.mdb;Persist Security Info=False", adOpenStatic, adLockOptimistic
  
  Set Grade.DataSource = TABELA
End Sub

Private Sub Grade_Click()
   MsgBox Grade.Rows & " ---- " & Grade.Row
End Sub

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

  • 0

Ok, usei a propriedade Clip do MS Hierarquical Flex Grid e funcionou. Porém, quando me bateu o desespero eu fui tentar usar o Data Grid (você disse que funciona com ADO) da mesma forma que o MSH Flex Grid, mas não deu certo.

Tipo, usei Set DataGrid1.Datasourse = rs, mas não apareceu nada na grade. Sabe me dizer se é possível preencher o Data Grid da mesma forma que o Hierarquical? Ele tem o mesmo bug?

Vlw

Link para o comentário
Compartilhar em outros sites

  • 0

Musashi

Para preencher o Datagrid faço da seguinte forma, ponho no Form_Load:

With Adodc1

.ConnectionString = cnn_Conexão

.CommandType = adCmdText

.RecordSource = "select * from tabela"

.Refresh

End With

Desta forma o controle fica ligado à minha conexão, o que não irá dar erro de localização de BD como quando se configura o Controle ADODC pelas propriedades, além de utilizar SQL para configurar os dados que quero que retorne no DataGrid, e acho o DataGrid um controle que possui muitas qualidades de configuração que ainda não encontrei em nenhum outro GRID.

OBS: não trabalho com o ADODC propriamente dito! ou seja, só utilizo da forma acima para preencher o DataGrid e mais nada, todas as consultas, inclusões, exclusões e todas outras rotinas são via Código.

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,3k
    • Posts
      652,4k
×
×
  • Criar Novo...