DUVIDAS PONTUAIS SOBRE ACESSO A DADOS
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???
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???
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...
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...
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???????
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???????
1) ....
2) a provável solução.
você sabendo qual [Ô]cobra[Ô] te mordeu, fica mais facil identificar a vacina.
2) a provável solução.
você sabendo qual [Ô]cobra[Ô] te mordeu, fica mais facil identificar a vacina.
Algum colega,
Pode esclarecer ??????
Pode esclarecer ??????
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:
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.
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.
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.
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.
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???????
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???????
Não existe [Ô]número de erro[Ô], existe um objeto para cada erro, cada erro vai retornar um objeto diferente
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[Ô]
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