Musashi_RS Postado Setembro 19, 2007 Denunciar Share Postado Setembro 19, 2007 (editado) 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.ConnectionDepois, em um formulário, na GERAL eu declarei:Dim WithEvents TB As ADODB.RecordsetE 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 ExibirDadosEnd SubNo 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 Setembro 19, 2007 por Musashi_RS Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Musashi_RS Postado Outubro 4, 2007 Autor Denunciar Share Postado Outubro 4, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Outubro 4, 2007 Denunciar Share Postado Outubro 4, 2007 (editado) 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 Outubro 4, 2007 por kuroi Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Musashi_RS Postado Outubro 4, 2007 Autor Denunciar Share Postado Outubro 4, 2007 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 ExibirDadosNesse 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: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Outubro 4, 2007 Denunciar Share Postado Outubro 4, 2007 muito estranho isso ai. se quiser mandar o projeto em rafaelsposito[a]gmail.com eu tento ver se descubro. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Musashi_RS Postado Outubro 4, 2007 Autor Denunciar Share Postado Outubro 4, 2007 OK.Vlw :rolleyes: Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Outubro 5, 2007 Denunciar Share Postado Outubro 5, 2007 achei aqui, o problema ta na linhaTABELA.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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Musashi_RS Postado Outubro 5, 2007 Autor Denunciar Share Postado Outubro 5, 2007 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. ;) Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Outubro 5, 2007 Denunciar Share Postado Outubro 5, 2007 Então o certo, para qualquer grid ou campo a ser preenchido, é sempre abrir o recordset com o objeto da conexão ativa?sim tb porque se não fosse pra usar, não teria nenhum sentido criar o objeto Connection e abrir a conexao. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Musashi_RS Postado Outubro 5, 2007 Autor Denunciar Share Postado Outubro 5, 2007 (editado) 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 PreencheComboPS. 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 Outubro 5, 2007 por Musashi_RS Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Outubro 9, 2007 Denunciar Share Postado Outubro 9, 2007 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?? Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Musashi_RS Postado Outubro 10, 2007 Autor Denunciar Share Postado Outubro 10, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Outubro 10, 2007 Denunciar Share Postado Outubro 10, 2007 Hmmm, entendi. Eu estava usando o set rs = Nothing em conjunto com o rs.close.. O último não "destroi" o recordset então?vlwnã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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Musashi_RS Postado Outubro 23, 2007 Autor Denunciar Share Postado Outubro 23, 2007 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 kuroi Postado Outubro 23, 2007 Denunciar Share Postado Outubro 23, 2007 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. Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Musashi_RS
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_RSLink para o comentário
Compartilhar em outros sites
39 respostass a esta questão
Posts Recomendados
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.