CLASSE ACESSA DB ADO
Pessoal, através da ajuda de nosso grande colega PROFESSOR, consegui entender o funcionamento do ADO, inclusive descobri que o uso de INSERT, DELETE E UPDATE é muito mais eficiente do que o .AddNew, .Delete e .Update, agora eu pergunto:
Estou desenvolvendo um programinha que vai usar o ADO, e gostaria de saber se alguém aqui usa algum tipo de classe para gerenciar os dados, consultas, etc, etc.
Tipo, eu coloquei em um modulo uma sub para abertura de Bds:
Assim:
Tem algum problema eu usar esta sub?
Tenho que abrir um recodset para cada consulta,ou para cada inclusao ou alteracao, gostaria de saber se é o correto.
Não haveria algum tipo de classe que eu pudesse chamar a funcao e especificar os parametros de consulta atraves do botao de chamada??
por exemplo:
Assim eu não precisaria abrir um recordset toda vez que fosse realizar uma consulta, bastaria passar os parametros.
Outro exemplo:
Eu até comecei a fazer uma classe para isso, mas me perdi devido ao pouco conhecimento de ADO e Classes, rs!
Pessoal acho que é isso, sou novato em VB e ainda mais em ADO, mas se estou começando gostaria de começar pelo modo mais correto e eficiente.
Agradeço a todos!
Estou desenvolvendo um programinha que vai usar o ADO, e gostaria de saber se alguém aqui usa algum tipo de classe para gerenciar os dados, consultas, etc, etc.
Tipo, eu coloquei em um modulo uma sub para abertura de Bds:
Assim:
Public Sub Abre_DB()
Dim Cn As ADODB.Connection
Set Cn = New ADODB.Connection
Cn.CursorLocation = adUseClient
Cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source= " & App.Path & "\banco\meubanco.mdb"
End Sub
Tem algum problema eu usar esta sub?
Tenho que abrir um recodset para cada consulta,ou para cada inclusao ou alteracao, gostaria de saber se é o correto.
Não haveria algum tipo de classe que eu pudesse chamar a funcao e especificar os parametros de consulta atraves do botao de chamada??
por exemplo:
Private Sub cmdExecutaQuery_Click()
call Executa_Consulta "Select * from minhatabela Order by minhatabela.nome"
End Sub
Assim eu não precisaria abrir um recordset toda vez que fosse realizar uma consulta, bastaria passar os parametros.
Outro exemplo:
Private Sub cmdInclui_Registros_Click()
call Inclusao_Registros "INSERT INTO minhatabela, etc,etc,etc
End Sub
Eu até comecei a fazer uma classe para isso, mas me perdi devido ao pouco conhecimento de ADO e Classes, rs!
Pessoal acho que é isso, sou novato em VB e ainda mais em ADO, mas se estou começando gostaria de começar pelo modo mais correto e eficiente.
Agradeço a todos!
apesar de poder usar classes, você tambem pode utilizar os modulos do VB, apenas crie as subs de forma public dentro de um modulo depois é só passar os paramentros
a sua sub Abre_DB esta correta bastando apenas coloca-la no modulo e chamando uma unica vez no load do seu projeto, não esqueça de que quando for fechar fazer
isto fecha a conexao e a destroi evitando problemas no seu projeto.
Public sub Alteradados(strAlteracao as string)
conexao.execute(strAlteracao)
end Sub
Private sub BotaoIncluir_click
call seumodulo.Alteradados("Insert into blablabla")
end Sub
Private Sub BotaoExcluir_click
call seumodulo.alteradados("Delete * from tabela blabla")
end Sub
a sua sub Abre_DB esta correta bastando apenas coloca-la no modulo e chamando uma unica vez no load do seu projeto, não esqueça de que quando for fechar fazer
Private sub projeto_Unload
conexao.close
set conexao = nothing
end Sub
isto fecha a conexao e a destroi evitando problemas no seu projeto.
Minha sugestão pessoal.
Esquece a classe.
Esquece o recordset ou seja pense SQL.
com SQL voce INC, ALT e EXC com eficiencia seu dados nas tabelas do BD.
O recordset serve pra vc mostrar/navegar quando da um SELECT nas tabelas do BD.
Não faça atualizações usando recordset. Use sempre SQL UPDATE ou INSERT.
Nos comandos SQL use o Begin Trans, Execute Commit Trans...
Se der problema Rollback...
Olha um exemplo ae...
' --------------------------------------------------------------------------------------
' Begin, Execute, Commit and RollBack if Error
' Record Error
' --------------------------------------------------------------------------------------
'Public Sub BeginExecuteCommit()
'
' Tratamento de Erro
'On Error GoTo Error_handler
'
' ' Inicio da Transacao SQL
' cnCeramica.BeginTrans
'
' ' Comandos SQL
' strSQL = "INSERT INTO Autori(Autore) VALUES ('" & sAutore & "')"
' ' Executa Comando SQL
' cnCeramica.Execute strSQL
'
' strSQL = "DELETE FROM Editori WHERE Editore = '" & sEditore & "'"
' ' Executa Comando SQL
' cnCeramica.Execute strSQL
'
' ' Efetiva as Alteracoes se NAO deu erro
' cnCeramica.CommitTrans
'
' ' Fecha Conexao
' cnCeramica.Close
' Set cnCeramica = Nothing
' Exit Sub
'
'Error_handler:
' ' Se deu Erro DESFAZ as Alteracoes
' cnCeramica.RollbackTrans
' MsgBox "An error occurred changing the records.", vbExclamation
'End Sub
Esquece a classe.
Esquece o recordset ou seja pense SQL.
com SQL voce INC, ALT e EXC com eficiencia seu dados nas tabelas do BD.
O recordset serve pra vc mostrar/navegar quando da um SELECT nas tabelas do BD.
Não faça atualizações usando recordset. Use sempre SQL UPDATE ou INSERT.
Nos comandos SQL use o Begin Trans, Execute Commit Trans...
Se der problema Rollback...
Olha um exemplo ae...
' --------------------------------------------------------------------------------------
' Begin, Execute, Commit and RollBack if Error
' Record Error
' --------------------------------------------------------------------------------------
'Public Sub BeginExecuteCommit()
'
' Tratamento de Erro
'On Error GoTo Error_handler
'
' ' Inicio da Transacao SQL
' cnCeramica.BeginTrans
'
' ' Comandos SQL
' strSQL = "INSERT INTO Autori(Autore) VALUES ('" & sAutore & "')"
' ' Executa Comando SQL
' cnCeramica.Execute strSQL
'
' strSQL = "DELETE FROM Editori WHERE Editore = '" & sEditore & "'"
' ' Executa Comando SQL
' cnCeramica.Execute strSQL
'
' ' Efetiva as Alteracoes se NAO deu erro
' cnCeramica.CommitTrans
'
' ' Fecha Conexao
' cnCeramica.Close
' Set cnCeramica = Nothing
' Exit Sub
'
'Error_handler:
' ' Se deu Erro DESFAZ as Alteracoes
' cnCeramica.RollbackTrans
' MsgBox "An error occurred changing the records.", vbExclamation
'End Sub
Isso ROBERTOMARQUES! Minha intenção é usar SQL o máximo possÃvel! Por isso mesmo quero encapsular os metodos de inclusao, consulta, alteracao e exclusao em uma classe, e passar os parametros por ela, se não conseguir, vai ser via módulo mesmo!
No exemplo do WILLIAN eu entendi como se faz, no seu também, porém vc poderia me explicar como vc faz para não usar recordset??
Ah, e dentro da 'Public Sub BeginExecuteCommit(), vc colocou um monte de comandos!? é assim mesmo ou foi só para dar uma idéia??
Obrigado WILLIAN!
Obrigado ROBERTOMARQUES!
No exemplo do WILLIAN eu entendi como se faz, no seu também, porém vc poderia me explicar como vc faz para não usar recordset??
Ah, e dentro da 'Public Sub BeginExecuteCommit(), vc colocou um monte de comandos!? é assim mesmo ou foi só para dar uma idéia??
Obrigado WILLIAN!
Obrigado ROBERTOMARQUES!
Sandro,
Primeiramente eu fiz um função para executar os comandos SQL.
Problema: se vc tem varios cnConexao.Execute strSQL, voce soh pode dar o .commit no final.
dai se der erro rola um ROLLBACK geral de todos os .execute
Se vc for usar classe ou função para cada um não vai funcionar.
Esquece a Public Sub...
Coloque em cada sequencia do seu codigo, conjuntos de:
.BeginTrans
.Execute SQl
....
.Execute SQL
Dai ao final
.CommitTrans
Se deu erro trata com .RollbackTrans
At,
Primeiramente eu fiz um função para executar os comandos SQL.
Problema: se vc tem varios cnConexao.Execute strSQL, voce soh pode dar o .commit no final.
dai se der erro rola um ROLLBACK geral de todos os .execute
Se vc for usar classe ou função para cada um não vai funcionar.
Esquece a Public Sub...
Coloque em cada sequencia do seu codigo, conjuntos de:
.BeginTrans
.Execute SQl
....
.Execute SQL
Dai ao final
.CommitTrans
Se deu erro trata com .RollbackTrans
At,
Obrigado a todos!
Tópico encerrado , respostas não são mais permitidas