CLASSE ACESSA DB ADO

USUARIO.EXCLUIDOS 12/09/2006 21:19:54
#171049
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:
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!

USUARIO.EXCLUIDOS 12/09/2006 21:34:43
#171054
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

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.
USUARIO.EXCLUIDOS 12/09/2006 21:34:47
#171055
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
USUARIO.EXCLUIDOS 12/09/2006 22:27:44
#171071
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!

USUARIO.EXCLUIDOS 12/09/2006 23:13:29
#171078
Resposta escolhida
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,

USUARIO.EXCLUIDOS 15/09/2006 00:31:36
#171591
Obrigado a todos!
Tópico encerrado , respostas não são mais permitidas