DUVIDAS PONTUAIS SOBRE ACESSO A DADOS

MARCOS 15/07/2011 10:10:24
#379241
Colegas,
Tenho feito várias perguntas sobre como lidar com classes de acesso a fonte de dados
Isto ocorre pois,eu não gosto de usar receitas de bolo. Faço questão de entender cada
linha do código que uso:


Na função abaixo:


Public Function Executar(ByVal InstrucaoSql As String) As Boolean


Try

Select Case Conectar()

Case Is = True

[ô]Cria objeto de Comando
Cmd = New OleDbCommand(InstrucaoSql, Con)

[ô]Executa Instrução Sql
Cmd.ExecuteNonQuery()

[ô]Retorna valor da função
Return True


Case Else

[ô]Retorna valor da função
Return False


End Select


Catch Ex As Exception

[ô]Retorna valor da função
Return False

[ô]Grava Log
Log.Gravar(Ex)


Finally

[ô]Descarta objeto
Cmd.Dispose()


End Try


Minhas dúvidas:

1.) é correto fazer o que fiz... Ou seja, se houver algum erro eu [Ô]registro[Ô] o erro em um Log e mando retornar [Ô]False[Ô] da função???
Esta certo,deveria fazer algo mais numa operaçâo de Insert,Delete ou Update???

2.) Caso tudo corra bem, eu estou mandando descartar da memória o objeto . Mas, fiquei pensando.... Se houver um erro, o finally irá
descartar o objeto da memória do mesmo jeito,independente do erro. Isto esta correto???
KERPLUNK 15/07/2011 10:39:06
#379247
Resposta escolhida
1 - Sim, log de erros sempre é importante. Mas o ideal é que pegue os erros por tipo, não somente o erro genérico, que deveria ser reservado para erros não específicos.
2 - Sim, do modo como está fazendo, o objeto será descartado de qualquer maneira. O ideal seria usar blocos [Ô]using[Ô], como no exemplo:
dim _retorno as boolean
_retorno = True
Using Cmd = New OleDbCommand(InstrucaoSql, Con)
Try
Cmd.ExecuteNonQuery()
Catch e As OleDbException
Dim errorMessages As String
Dim i As Integer

For i = 0 To e.Errors.Count - 1
errorMessages += [Ô]Index #[Ô] & i.ToString() & ControlChars.Cr _
& [Ô]Mensagem: [Ô] & e.Errors(i).Message & ControlChars.Cr _
& [Ô]Erro nativo: [Ô] & e.Errors(i).NativeError & ControlChars.Cr _
& [Ô]Source: [Ô] & e.Errors(i).Source & ControlChars.Cr _
& [Ô]SQLState: [Ô] & e.Errors(i).SQLState & ControlChars.Cr
Next i
log.Gravar(errorMessages)
_return = False
Catch Ex as Excpetion
log.Gravar(ex)
_return = False
End Try

End Using
Return _return

O bloco using, garante que o objeto será descartado e recolhido pelo garbage collector, assim que não estiver mais em uso.
PS: A identação tá uma droga... Escrevi de cabeça, não sei se está totalmente correto sintaticamente, mas é algo muito parecido com isso...
MARCOS 15/07/2011 11:07:28
#379253
Olá,Kerlunk!

1.) Uma vez que eu utilize o Bloco [Ô]Using[Ô], posso passar a deixar de descartar nos meus códigos meus objetos
usando o método [Ô]Dispose[Ô]????


2.) Eu já sabia que se podia no tratamento de erros, capturar os erros por [Ô]Tipo[Ô]. Mas, sinceramente eu ainda não entendi qual a diferença (Vantagem) entre
fazer isto. Na minha ignorância eu fico imaginando..... o erro seja capturado por tipo ou de um modo genérico,será capturado de qualquer modo. E vai exigir
tanto num caso como noutro que eu o trate. Então, qual a diferença, ou vantagem em capturar o erro por tipo???????
ONBASS 15/07/2011 11:50:19
#379259
1) ....

2) a provável solução.
você sabendo qual [Ô]cobra[Ô] te mordeu, fica mais facil identificar a vacina.
MARCOS 15/07/2011 12:57:26
#379268
Algum colega,
Pode esclarecer ??????
PEGUDO 15/07/2011 13:38:05
#379272
1. Apesar de também gostar de usar o [Ô]Using[Ô], nunca deixo de descartar os objetos, pois acredito que o programa rodará mais livremente se o FrameWork não precisar utilizar o [Ô]Garbage Collector[Ô].

2. Na verdade o bloco de comando Try veio como uma revolução para tratamento de erros, exemplo:
Claro que existe uma maneira mais fácil de se fazer isto, mas suponha que, no retorno de um dado, você precise mostrar várias mensagens para o usuário:
    [txt-color=#0000f0]Try[/txt-color]
[txt-color=#007100][ô]Código que retorna o dado[/txt-color]
[txt-color=#0000f0]Catch[/txt-color] ex [txt-color=#0000f0]As[/txt-color] ArgumentNullException [txt-color=#007100][ô]Erro de nulo[/txt-color]
MsgBox([txt-color=#e80000][Ô]A pesquisa retornou um valor nulo. Certifique-se de que o caminho esteja correto[Ô][/txt-color])
[txt-color=#0000f0]Catch[/txt-color] Excep [txt-color=#0000f0]As[/txt-color] ApplicationException [txt-color=#0000f0][ô]Erro de parada brusca do programa[/txt-color]
MsgBox([txt-color=#e80000][Ô]Ocorreu um erro interno. O programa irá fechar.[Ô][/txt-color])
[txt-color=#0000f0]Catch[/txt-color] OutraExc [txt-color=#0000f0]As[/txt-color] Data.InvalidExpressionException [txt-color=#007100][ô]Erro de expressões[/txt-color]
MsgBox([txt-color=#e80000][Ô]A expressão SQL parace inválida.[Ô][/txt-color])
[txt-color=#0000f0]Catch[/txt-color] ErroGenerico [txt-color=#0000f0]As[/txt-color] Exception [txt-color=#007100][ô]Erros genéricos[/txt-color]
MsgBox(ErroGenerico.Message)
[txt-color=#0000f0]Finally[/txt-color]
[txt-color=#007100][ô]Código para fechar conexão (Vai executar dando erro ou não)[/txt-color]
[txt-color=#0000f0]End Try[/txt-color]

Neste caso, você está explicando para o programa para mostrar que mensagem aparecer caso dê o tipo de erro após a palavra-chave [txt-color=#0000f0]As[/txt-color].
ou vai exibir o erro mostrado em [txt-color=#0000f0]MsgBox(ErroGenerico.Message)[/txt-color], caso não dê nenhum dos erros discriminados acima de [txt-color=#0000f0]Catch ErroGenerico As Exception[/txt-color].

Espero ter ajudado um pouco nesta sua dúvida.
KERPLUNK 15/07/2011 13:45:16
#379273
1 - Sim, o bloco using automaticamente executa o Dispose no seu final, portanto, não precisa se preocupar com isso. Lógico, só se pode aplicá-lo à objetos que implmentem a interface IDisposable, o que é o caso do OleDbCommand
2 - A identificação do tipo de erro é importante para o tratamento do mesmo. Alguns erros, como um [Ô]time out[Ô] por exemplo, podem dar a opção de re-executar. Ou então, imagine que o comando retornou um erro de [Ô]falta de parâmetros obrigatórios[Ô], vc pode enviar para o usuário a mensagem de que o parâmetro está faltando. Ou se um dos parâmetros excedeu o tamanho, como um campo de texto por exemplo. Concluíndo, erro, é feito para tratar sempre que possível, somente informar ao desenvolvedor que este ocorreu, nem sempre(ou quase nunca) é suficiente.
MARCOS 15/07/2011 15:54:25
#379289
Pessoal,
Desculpe se parece que sou teimoso.Garanto que não é isso.Rss

Mas....

O que os colegas estão dizendo é que ao separar os erros por [Ô]tipos[Ô], eu tenho como personalizar a mensagem para o usuário.Entendi perfeitamente!!!

No entanto, até onde sei podemos fazer isso usando uma simples instrução condicional (IF,ou Select) no Catch.Ou seja ,posso fazer um [Ô]IF[Ô] com o
número ou com a mensagem de erro e personalizar do mesmo jeito.Então, fico sem entender muito bem, qual a vantagem em se utilizar os [Ô]tipos[Ô] no
tratamento de erro.Ou estou dizendo bobagem???????
KERPLUNK 16/07/2011 14:40:56
#379345
Não existe [Ô]número de erro[Ô], existe um objeto para cada erro, cada erro vai retornar um objeto diferente
MARCOS 18/07/2011 09:59:58
#379423
Olá,Kerlunk!
Obrigado por me chamar a atenção, para o fato de no VB.NET não ter o número.

No entanto, minha pergunta ainda é relevante,pois:

Não poderia criar a estrutura condicional, baseado na [Ô]mensagem[Ô] de erro?????

Entendi,eu não vejo porque ter necessariamente tratar por [Ô]tipos[Ô] de erro, se posso tratar por mensagem, usando um [Ô]IF[Ô]

Tópico encerrado , respostas não são mais permitidas