Jump to content
Fórum Script Brasil
  • 0

Ado - Dúvida


Musashi_RS
 Share

Question

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

Edited by Musashi_RS
Link to comment
Share on other sites

Recommended Posts

  • 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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

Edited by Musashi_RS
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other 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

Edited by Musashi_RS
Link to comment
Share on other 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 to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.8k
    • Total Posts
      646.6k
×
×
  • Create New...