Guilherme's profileGuilherme de Carvalho Ca...PhotosBlogListsMore Tools Help

Blog


    November 22

    Cloud computing de forma simples

    Cloud computing ou computação nas nuvens é a onda da vez, os grandes da TI já aderiram a esta onda, IBM, Google, Microsoft são alguns exemplos de empresas que já adotaram esta nova estrutura de TI, onde os dados ficam em servidores distribuídos e acessíveis via web, veja este vídeo muito legal que apresenta de forma simples o que é Cloud computing.

     
    September 09

    Apenas para descontrair (Mudei de Lado).

    MUDEI DE LADO . . .

    Resolvi ficar ao lado de Lula ...
    Que me desculpem meus amigos, e por favor não me critiquem, mas após esfriar a cabeça e analisar melhor a situação atual, considerei melhor... e mudei..... de agora em diante, ficarei ao lado do Lula !

    Se eu ficar atrás... Ele me caga.
    Se eu ficar na frente... Ele me fode!
    Como não há alternativa, resolvi ficar ao lado dele...

    ENTÃO, PENSANDO BEM, CONCLUI QUE QUANDO TUDO VOLTAR AO NORMAL...

    Será o dia em que:

    - GENUÍNO será algo verdadeiro;
    - GENRO apenas o marido da filha;
    - SEVERINO apenas o porteiro do prédio;
    - FREUD voltará a ser o só criador da Psicanálise;
    - LORENZETTI será só uma marca de chuveiro;
    - GREENGALGH voltará a ser um almirante que participou de nossa história;
    - Dirceu, Palloci, Delúbio, Silvio Pereira, Berzoini,Gedimar,Valdebran, Bargas, Expedito Veloso, Gushiken, etc, serão simples.... presidiários.
    - E LULA APENAS UM FRUTO DO MAR.

    Agora, quando olho meu titulo de eleitor, entendo o verdadeiro significado do nome  'ZONA ELEITORAL' !

    September 06

    AutoComplete com jQuery e asp.net

    O objetivo deste post não é determinar qual a melhor abordagem a ser adotada no desenvolvimento de um componente de autocompletar nas aplicações asp.net, mas mostrar uma alternativa ao AutoComplet do Toolkit.
     
    Vamos utilizar o jQuery[1], framework para desenvolvimento com JavaScript e AJAX, fazendo o download do arquivo [2], podemos colocá-lo dentro de uma pasta js na nossa aplicação. Após isto poderemos referenciar o framework na nossa webform, onde queremos implentar tal solução. Por ser um arquivo js basta colocarmos no head do nosso webform o link para o arquivo assim: 
     

    <asp:ScriptReference Path="~/jQuery/jquery-1.3.2.js" />

     Você pode estar achando estranho a forma com que referenciei o arquivo, mas como estou usando MasterPage, é necessário que a referencia ao arquivo siga este padrão. Esta referência deve ser feita no arquivo da MasterPage.

    Agora podemos ir para a parte de criação da aplicação que irá fazer a busca no banco de dados para trazer os dados do banco e disponibilizá-los para o componente onde queremos implementar a função de autocomplete, que no nosso caso será um TextBox. Não iremos utilizar um webservice, pois com o uso do jQuery podemos criar esta funcionalidade com uma simples página aspx, bastando para isto criar a função no evento page_load, como mostrado abaixo.

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Response.Expires = -1
            Response.ContentType = "text/plain"
            Dim txtResposta As New Text.StringBuilder
            Dim Dr As Npgsql.NpgsqlDataReader
            Dim conPgsql As New NpgsqlConnection(PgConexao.ToString)
            Dim comPgsql As New NpgsqlCommand
            Dim usuarioLogado As Integer = Request.Cookies("UserID").Value
            Try
                comPgsql.Connection = conPgsql
                conPgsql.Open()
                With comPgsql
                    .CommandType = Data.CommandType.Text
                    .CommandText = "SELECT CAST(proc.numero AS TEXT) FROM advogaweb.processo proc INNER JOIN advogaweb.advogado_processo advpr ON proc.idprocesso = advpr.fkprocesso WHERE proc.situacao=0 AND advpr.fkadvogado = CAST(:s1 AS Integer)"
                    .Parameters.Add(New NpgsqlParameter("s1", NpgsqlDbType.Text))
                    .Parameters(0).Value = usuarioLogado
                    Dr = .ExecuteReader()
                End With
                If Dr.HasRows Then
                    While Dr.Read
                        txtResposta.Append(Dr(0).ToString)
                        txtResposta.Append(" ")
                    End While
                    txtResposta.Remove(txtResposta.Length - 1, 1)
                End If
            Catch exPgsql As NpgsqlException
                conPgsql.Close()
            Catch ex As Exception
                conPgsql.Close()
            Finally
                conPgsql.Close()
            End Try
            Response.Write(txtResposta.ToString())
            Response.End()
        End Sub

      A função é auto explicativa, bastando prestar atenção em alguns detalhes, como o tipo do retorno que deve ser uma string e tem que ser retornada pelo response.write. Outro ponto que devemos ter atenção é nas primeiras linhas.

            Response.Expires = -1
            Response.ContentType = "text/plain"

    Estas configurações são necessárias para funcionar da maneira correta, lembrando que você pode adotar uma outra abordagem. Agora podemos partir para a configuração do evento jQuery a ser executado.

    Neste caso foi criada uma função para poder aproveitar o máximo a reusabilidade.

    (function($) {
            $.getProcessosAutocomplete = function() {           
               $.ajax({
                    url: "../admsistema/jQuery.aspx",
                    async: false,
                    success: function(data){                    
                        var processos = data.split(" ");
                        $('.inputProcesso').autocomplete(processos,
                            {
                                width:180, highlight: false, multiple: false, scroll: true, scrollHeight: 300, autoFill:true
                            }
                        );
                    }
                });
            }
        })(jQuery);   


    Neste caso estamos usando o plugin autocomplete[3] do jQuery. A função javascript acima faz requisição ajax ao webform jquery.aspx que tem a função mostrada acima. Depois de tal requisição o resultado é jogado dentro da variável data, que recebe uma string no formato "a b d e f g h i j ..." seria uma string separada por espaços em branco, entretanto o plugin autocomplete precisa de um Array, por isto eu faço o data.split(" ") jogando o resultado dentro da variável processos, que será passado como primeiro parâmetro do autocomplete.

    Foi necessário configurar o async: false ou seja nosso evento será de forma sincrona, porque no meu caso eu precisei implementar a rotina no load da página, mas se desejar que seja de forma assincrona basta configurar para async: true, ou retirar tal parâmetro, porque o default é true

    O segundo parâmetro serve apenas para configurar a exibição do autocomplete, e tais configurações podem ser consultadas na página do autocomplete.

    [1] http://www.jquery.com
    [2] http://docs.jquery.com/Downloading_jQuery
    [3] http://plugins.jquery.com/project/autocompletex

    Bom espero ter sido bem claro neste post, e que sirva de ajuda para quem necessitar implementar tal funcionalidade nas suas aplicações.

    July 03

    jQuery com asp.net e MasterPage

    Após alguns problemas com o Toolkit, não tenho nada a reclamar, percebi que precisava de um outro Framework para facilitar o trabalho com AJAX/JavaScript, então após dar uma navegada e ler alguns depoimentos decidi testar o jQuery[1], que realmente é muito lega e fácil de trabalhar, mas quando tentei integrar o jQuery na minha aplicação começaram os problemas e exetamente com o IE. Fui pesquisar novamente e encontrei o que pode ser a solução dos problemas para integrar jQuery+asp.net+MasterPage.
     
    A primeira coisa que descobri foi justamente como gerenciar de forma correta o caminho para os scripts jQuery, pois como tenho a master page fazer a referência utilizando o <script type='text/javascript' src='~/jQuery/jquery.js'></script> gera um erro de referência ao arquivo, então a primeira solução foi trabalhar com o <ScriptManager> adicionando uma entrada chamada <Scripts> que aí dentro desta entrada eu posso chamar a referência ao scripts de forma transparente assim: <asp:ScriptReference Path="~/jQuery/jquery.js" /> trabalhando desta maneira a referência aos arquivos não gera dor de cabeça, o você poderá desfrutar de todas as funcionalidades do jQuery.
    Ficando desta maneira o bloco do ScriptManager na MasterPage

    <ScriptManager ...>
       <Scripts>
          <asp:ScriptReference Path="jQuery/jquery.js" />
       </Scripts>
    </ScriptManager>
     
    Um outro problema que encontrei foi como  fazer a referência aos elementos que eu queria tratar com o jQuery, pois os elementos por estarem dentro de um ContentPlace a referência por nome fica um pouco complicada. Para isto eu trabalhei com o atributo Class para os elementos asp:TextBox e na função do jQuery a ligação com o elemento é feita assim:
     
     $("input[class *= 'txtAutocompletar']").autocomplete(["a", "ab", "abc", "abcd", "abcde", "abcdef"], {
            width: 180,
            max: 5,
            highlight: false,
            multiple: false,
            scroll: true,
            scrollHeight: 300
    });
     
    O que estou fazendo aí é dizendo que qualquer elemento do tipo input que tenha o atributo class com um texto conteudo uma parte dele igual a txtAutocompletar (*=) executará esta função.

    Vale salientar que a Microsft tem planos de integrar o jQuery ao Visual Studio, para a versão 2008 existe um rotfix[2] e um arquivo[3] para incluir o intellisense do jQuery.
     
     
    Abraços a todos e bom trabalho
     





    June 18

    Tá estressado? Assista.

     
     
    May 17

    A velha batalha entre o JAVA e o Dotnet

    Como todos dizem "O Java é superior, faz mais coisas, é multiplataforma, etc e tal" bem parecido com o carinha da capoeira no vídeo abaixo, e o DotNET como dizem "É de uma empresa grande, pesada, etc e tal" parecido com o branquinho, que na maior parte do tempo fica quieto sem muitas firulas apenas olhando as piruetas do JAVA, ops! do carinha da capoeira,


     

    Mas no final vejam o que acontece.
    March 29

    Tecnologia no varejo.

    Será que chegaremos a fazer compras desta maneira?

      

    February 06

    Lendo arquivo XML com Xpath e XmlDocument

    Nesta semana me apareceu a necessidade de ler um arquivo XML, e não poderia utilizar DataSet ou DataTable para tal, aí desenvolvi este código para realizar o trabalho, visto que tinha que acessar além dos nós do XML atributos também. O Formato do arquivo XML é algo assim, reduzi o arquivo para melhorar o entendimento:

             <?xml version="1.0" encoding="utf-8"?>
                   <
    itens>
                      <
    item id="cliente">
                         <
    nomecampo><![CDATA[Nome do cliente]]></nomecampo>
                         <
    valorcampo><![CDATA[#$strnomecli]]></valorcampo>
                      </
    item>
                      <
    item id="funcionario">
                         <
    nomecampo><![CDATA[Nome do funcionário]]></nomecampo>
                         <
    valorcampo><![CDATA[#$strnomefunc]]></valorcampo>
                         <
    nomecampo><![CDATA[Matrícula Funcionário]]></nomecampo>
                         <
    valorcampo><![CDATA[#$stromatfunc]]></valorcampo>
                      </item>
     
                   
    </itens>

    Abaixo o código que desenvolvi, para tratar estes requisitos:
     

    Dim

    xmlDocumento As XmlDocument = New XmlDocument 'Criando um objeto XmlDocument
    Dim strCaminho As String = Server.MapPath("~/App_Data/ItensAtributos.xml") 'Criando um objeto String para conter o caminho do arquivo XML
    xmlDocumento.Load(strCaminho) 'Carregando o arquivo XML para o objeto XmlDocumento

    Dim navegadorXml As System.Xml.XPath.XPathNavigator = xmlDocumento.CreateNavigator 'Criando um XpathNavigator baseado no xmlDocumento

    Dim listaCat As New List(Of cl_modelodocumento_dto) 'Criando uma lista genérica, que irá receber os dados da consulta ao Xml

    Dim itemCat As cl_modelodocumento_dto 'Instanciando um objeto do tipo modelodocumento_dto

    Dim xmlNo As XmlNode 'Criando um XmlNode

    Dim xmlListaNomeCampo, xmlListaValorCampo As XmlNodeList 'Criando dos objetos do tipo XmlNodeList, que vão percorrer os nós do Xml

    Dim strAtributo As String = String.Empty 'Criando uma string que irá receber o conteúdo dos atributos ID dos nós ITEM do arquivo XML, mostrado acima

    Try

       For
    Each xmlNo In xmlDocumento.SelectNodes("/itens/item") 'Percorrendo todos os nós ITEM contidos no arquivo XML

          itemCat =

    New cl_modelodocumento_dto 'Criando um novo objeto do tipo modelodocumento_dto

          With itemCat 
             .titulo = xmlNo.SelectSingleNode(
    "@id").Value.ToString 'Atribuindo o conteudo do atributo ID dos nós ITEM à propriedade titulo do objeto itemCat
             listaCat.Add(itemCat) 'Adicionando o itemCat à lista genérica de itemCat 
          
    End With

          xmlListaNomeCampo = xmlNo.SelectNodes(
    "nomecampo") 'Retornando o conteúdo do nó nomecampo para o xmlNodeList xmlListaNomeCampo

          xmlListaValorCampo = xmlNo.SelectNodes(

    "valorcampo") 'Retornando o conteúdo do nó valorcampo para o xmlNodeList xmlListaValorCampo

       Next

    Catch ex As Exception

    End Try

    Esta é a minha solução que encontrei para o problema, claro que outros desenvolvedores podem achar outras soluções melhores, ou piores de resolverem o problema. Caso você ache uma solução melhor e desejar compartilhar envia como comentário.

    January 08

    Uso correto da tecnologia

    Quando utilizada de forma séria e responsável a tecnologia existente pode ser uma forte aliada para todos que necessitem.

    http://info.abril.uol.com.br/aberto/infonews/012009/08012009-28.shl

    October 14

    Silverlight 2.0 aumenta espaço para participação de desenvolvedores

    Framingham - Parceria com projeto open source atrai desenvolvedores do framework Eclipse, e Microsoft abre espaço a quem cria com .Net.

    O plug-in para navegadores Silverlight 2.0, da Microsoft, que chega ao mercado na próxima terça-feira (14/10), pretende motivar desenvolvedores e designers a interagirem com a plataforma concorrente do Adobe Flash.

    Com o lançamento, a Microsoft também anunciou uma parceria com um projeto open source da França, que permitiria aos programadores usarem o framework Eclipse para criar aplicativos para o Silverlight - que poderão ser compartilhados com desenvolvedores trabalhando com o Visual Studio.

    A Microsoft também lança gratuitamente o Silverlight Control Pack, pacote de modelos de programação, sob a Microsoft Permissive License, além de especificação técnica para a Extensible Application Markup Language (XAML) do Silverlight, o que também facilitará a vida de potenciais desenvolvedores da plataforma.

    Com o Silverlight 2.0, os desenvolvedores .Net também podem criar aplicativos usando esta linguagem, e a Microsoft também inclui compatibilidade com JavaScript, Ruby e Python.

    A Adobe afirma que 96% da base mundial de computadores têm o Flash Player 9 instalado. Segundo a Microsoft, um em cada quatro usuários tem acesso a uma máquina com o Silverlight instalado.

    Eric Lai, editor do Computerworld, de Framingham

    http://idgnow.uol.com.br/computacao_pessoal/2008/10/13/silverlight-2-0-aumenta-espaco-para-participacao-de-desenvolvedores/

     

    August 30

    SECOP 2008

    Encerrou-se na tarde de ontem o SECOP 2208, evento sobre tecnologia para govenos, onde inúmeras tecnologias e softwares foram apresentados na capital Tocantinense.
     
    DSC00019
     
    Tal evento acontece anualmente para tratar do uso da tecnologia nas administrações públicas, o uso da tecnologia por parte dos governos proporciona um ganho de qualidade no serviço prestado como também melhora a transparência do governo, proporcionando à população acesso a informações que antes eram tratadas como segredo de estado. Gostaria de destacar entretanto que apenas uma solução em Dot Net foi apresentada em todo o evento, o que mostra que em se tratando de órgãos públicos o DotNet realmente está totalmente excluído.
     
    Mas de qualquer maneira parabenizo os organizadores pois o evento mostra que os administradores público estão tomando conhecimento que a TI não é um setor gerador de custos, mas sim um redutor de trabalho desnecessário e que gera uma grande melhoria no serviço prestado para a população.
     
    Espero que num futuro próximo no Image Cup possamos ver uma competição sobre o assunto.
    July 21

    Acessibilidade

    Num mundo onde o conhecimento é a principal arma para ganhar mercado, a acessibilidade torna-se uma ferramenta indispensável para o bom desempenho do seu site ou sistema, você já imaginou o seu sistema excluir sem nenhum aviso determinada clientela?
    Isto mesmo, por mero descuido ou falta de conhecimento desenvolvemos sistes e sistemas que impedem, o acesso de determinados usuários ao sistema. A simples falta de elementos, ALT e/ou TITLE em determinadas tags, impedem o acesso por deficientes visuais, que utilizam softwares que fazem a leitura dos elementos apresentados na tela.
     
    A deficiência não necessariamente tem que ser permante, o que em muitos casos torna o impacto do não acesso mais prejudicial ainda. Em determinada situação, meu irmão que é cadeirante me envio um link de um site de venda de materiais para deficientes físicos, para que eu desse uma olhada, o site realmente é muito interessante, e vende todo tipo de produto para todas as deficiências que eu tenho conhecimento. Mas logo percebi que a mais simples das regras de acessibilidade que é trabalhar com elementos que possam ser lidos por programas leitores de telas não está presente no site. O primeiro e maior elemento que encontrei na tela foi uma animação em flash que no meu caso aparentou ser o elemento mais importante do site, até mesmo mais importante que os ítens à venda.
     
    Este é apenas um simples exemplo onde a adoção de tecnologias não condizentes com os objetivos do site torna o acesso impossível para o seu maior alvo que neste caso são os deficientes físicos.
     
    Creio que a acessibilidade logo em breve será um divisor entre as empresas que entendem que a internet é um canal com o público alvo, e as outras empresas que acham que o mais importante é ter a animação em flash mais bonita e com mais efeitos piro-técnicos.
     
     
    May 04

    Class Library para acesso ao PostgreSQL. - Parte 3

    Nesta última parte do post sobre acesso ao PostgreSQL trago as funções de adição dos parâmetros dos tipos possíveis no PostgreSQL.

     

        Public Function criar_parametro_text(ByVal str_chave As String, ByVal par_valor As String) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Text

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_decimal(ByVal str_chave As String, ByVal par_valor As Decimal) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Numeric

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_double(ByVal str_chave As String, ByVal par_valor As Double) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Double

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_datetime(ByVal str_chave As String, ByVal par_valor As DateTime) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Timestamp

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_bytea(ByVal str_chave As String, ByVal par_valor As Byte()) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Bytea

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_char(ByVal str_chave As String, ByVal par_valor As Char) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Char

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_booleano(ByVal str_chave As String, ByVal par_valor As Boolean) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Boolean

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_inteirogrande(ByVal str_chave As String, ByVal par_valor As Integer) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Bigint

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_inteiro(ByVal str_chave As String, ByVal par_valor As Int16) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Integer

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

     

        Public Function criar_parametro_string(ByVal str_chave As String, ByVal par_valor As String) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Varchar

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

       

        Public Function criar_parametro_ip(ByVal str_chave As String, ByVal par_valor As System.Net.IPAddress) As NpgsqlCommand

            Dim TipoParametro As New NpgsqlDbType

            PgParametro = New NpgsqlParameter()

            Try

                PgParametro.ParameterName = str_chave

                PgParametro.NpgsqlDbType = NpgsqlDbType.Inet

                PgParametro.Value = par_valor

                PgComando.Parameters.Add(PgParametro)

            Catch ex As NpgsqlException

                Call Me.fechar_conexao()

            End Try

            Return PgComando

        End Function

    Class Library para acesso ao PostgreSQL. - Parte 2

     
    Nesta segunda parte do post sobre a Class Library estou tratando de funções para retornar DataSet, DataTable, DataTableReader e trambém uma função para gravar numa tabela na base os erros na hora de criar/executar funções de acesso ao PostgreSQL.
     

    ''' <summary>

        ''' Função para executar comandos que retornem objetos do tipo DataSet

        ''' </summary>

        ''' <returns>DataSet</returns>

        ''' <remarks></remarks>

        Public Function retornar_dataset() As DataSet

            Ds = New Data.DataSet

            Try

                Call Me.abrir_conexao()

                PgAdaptador = New NpgsqlDataAdapter(PgComando)

                PgAdaptador.Fill(Ds)

            Catch ex As Exception

            Finally

                Call Me.fechar_conexao()

            End Try

            Return Ds

        End Function

     

        ''' <summary>

        ''' Função para executar comandos que retornem objetos do tipo DataTable

        ''' </summary>

        ''' <param name="str_tabela">Nome a ser dado ao objeto DataTable</param>

        ''' <returns>DataTable</returns>

        ''' <remarks></remarks>

        Public Function retornar_datatable(ByVal str_tabela As String) As DataTable

            Dt = New DataTable(str_tabela)

            Try

                Call Me.abrir_conexao()

                PgAdaptador = New NpgsqlDataAdapter(PgComando)

                PgAdaptador.Fill(Dt)

            Catch ex As Exception

     

            Finally

                Call Me.fechar_conexao()

            End Try

            Return Dt

        End Function

     

        ''' <summary>

        ''' Função para executar comandos que retornem objetos do tipo DataTableReader

        ''' </summary>

        ''' <param name="str_tabela">Nome a ser dado ao objeto DataTableReader</param>

        ''' <returns>DataTableReader</returns>

        ''' <remarks></remarks>

        Public Function retornar_datatablereader(ByVal str_tabela As String) As DataTableReader

            Try

                Call Me.abrir_conexao()

                PgAdaptador = New NpgsqlDataAdapter(PgComando)

                Dt = New DataTable(str_tabela)

                PgAdaptador.Fill(Dt)

                Dtr = Dt.CreateDataReader

            Catch ex As Exception

     

            Finally

                Call Me.fechar_conexao()

            End Try

            Return Dtr

        End Function

    ''' <summary>

        ''' Sub para gravar na tabela log_erro os erros na hora de construir ou executar os comandos de acesso ao PostgreSQL

        ''' </summary>

        ''' <param name="par_str_erro">Nome da excessão que disparou o erro</param>

        ''' <param name="par_str_chamada">Função / Sub que disparou o erro</param>

        ''' <remarks></remarks>

        Private Sub sb_erro_npgsql(ByVal par_str_erro As String, ByVal par_str_chamada As String)

            Dim Erro As String = par_str_erro

            Dim Chamada As String = par_str_chamada

            Dim i As Integer

            Call Me.criar_comando("INSERT INTO advogaweb.log_erro (mensagem, pagina) VALUES (:mensagem,:pagina)", "server=localhost;port=5432;user id=postgres;password=postgres;database=ADVOGAWEB")

            Call Me.criar_parametro_string("mensagem", par_str_erro)

            Call Me.criar_parametro_string("pagina", par_str_chamada)

            i = Me.executar_insertupdatedelete()

        End Sub

    Class Library para acesso ao PostgreSQL. - Parte 1

    Neste classe que estou desenvolvendo para acesso ao postgreSQL, estou percebendo um problema pelo Process Explorer que o processo postgres.exe aparece inúmeras vezes, tipo umas 46 vezes, mas percebo também que isto acontece quando estou usando o programa EMS PostgreSQL, de qualquer forma estou publicando este post para compartilhar o conhecimento e quem sabe melhorarmos em conjunto, com aqueles que compartilharem seus conhecimentos, e criarmos uma classe que resolva todos os processos de conexção com o PostgreSQL.

     

    Este post é dividido em 3 por causa do tamanho. Na segunda parte estou postando as funções de execuções para retornar DataSet, DataTable, e uma Sub para gravar numa tabela no banco os erros gerados pela classe.

     

    Imports Microsoft.VisualBasic

    Imports Npgsql

    Imports NpgsqlTypes

    Imports System.Data

     

    Public Class ClPgDAL

        Private PgConexao As NpgsqlConnection

        Private PgComando As NpgsqlCommand

        Private PgParametro As NpgsqlParameter

        Private PgAdaptador As NpgsqlDataAdapter

        Private PgTransacao As NpgsqlTransaction

        Private PgDataReader As NpgsqlDataReader

        Private Ds As DataSet

        Private Dt As DataTable

        Private Dtr As DataTableReader

     

        ''' <summary>

        ''' Fuñção interna para criar a conexão

        ''' </summary>

        ''' <param name="str_conexao">String da conexão</param>

        ''' <returns>Conexão</returns>

        ''' <remarks></remarks>

        Private Function cria_conexao(ByVal str_conexao As String) As NpgsqlConnection

            PgConexao = New NpgsqlConnection(str_conexao)

            Return PgConexao

        End Function

     

        ''' <summary>

        ''' Função interna para abrir a conexão no último momento

        ''' </summary>

        ''' <returns>Conexão</returns>

        ''' <remarks></remarks>

        Private Function abrir_conexao() As NpgsqlConnection

            PgConexao.Open()

            Return PgConexao

        End Function

     

        ''' <summary>

        ''' Função para fechar a conexão aberta

        ''' </summary>

        ''' <remarks></remarks>

        Public Sub fechar_conexao()

            If PgConexao.State = ConnectionState.Open Then

                PgConexao.Close()

            End If

        End Sub

     

        ''' <summary>

        ''' Função para criar o comando Sql a ser executado

        ''' </summary>

        ''' <param name="str_comando">String com o comando a ser executado</param>

        ''' <param name="str_conexao">String com a conexão</param>

        ''' <returns>Comando SQl</returns>

        ''' <remarks></remarks>

        Public Function criar_comando(ByVal str_comando As String, ByVal str_conexao As String) As NpgsqlCommand

            PgComando = New NpgsqlCommand(str_comando, cria_conexao(str_conexao))

            PgComando.CommandType = CommandType.Text

            PgComando.CommandTimeout = 60

            Return PgComando

        End Function

        

        ''' <summary>

        ''' Função para executar comandos de inserção, deleção, atualização

        ''' </summary>

        ''' <returns>Inteiro com a quantidade de registros afetados pela execução</returns>

        ''' <remarks></remarks>

        Public Function executar_insertupdatedelete() As Integer

            Dim i As Integer = 0

            Try

                Call Me.abrir_conexao()

                i = PgComando.ExecuteNonQuery

            Catch ex As Exception

                Call Me.sb_erro_npgsql(ex.Message, "Parametro Ip")

            Finally

                Call Me.fechar_conexao()

            End Try

            Return i

        End Function

     

        ''' <summary>

        ''' Função para executar comandos que retornem apenas um registro

        ''' </summary>

        ''' <returns>String com o resultado da execução do comando SQL</returns>

        ''' <remarks></remarks>

        Public Function executar_escalar() As String

            Dim str_resultado As String = ""

            Try

                Call Me.abrir_conexao()

                str_resultado = CType(PgComando.ExecuteScalar, String)

            Catch ex As Exception

                Call Me.sb_erro_npgsql(ex.Message, "Erro no execute Scalar")

            Finally

                Call Me.fechar_conexao()

            End Try

            Return str_resultado

        End Function

     

        ''' <summary>

        ''' Função para executar comandos que retornem objetos do tipo DataReader

        ''' </summary>

        ''' <returns>NpgsqlDataReader</returns>

        ''' <remarks></remarks>

        Public Function retornar_datareader() As NpgsqlDataReader

            Try

                Call Me.abrir_conexao()

                PgDataReader = PgComando.ExecuteReader

            Catch ex As Exception

                Call Me.sb_erro_npgsql(ex.Message, "Erro no retorno do DataReader")

            Finally

                Call Me.fechar_conexao()

            End Try

            Return PgDataReader

        End Function

    End Class

    February 25

    Artigo sobre .net 3.5

    Vídeo muito interessante sobre algumas novas funcionalidades do .net 3.5
     
     
     
    Abraços.
    February 17

    Férias

    Bom pessoal desculpem a ausência, mas estou de férias, volto dia 3 de Março.



    Abraços.

    November 28

    A tela azul modou de cor ?

     

    Parece mais uma saga do problema do windows, mas...

     
    Só acontece comigo mesmo. Segunda-feira, dia chuvoso e preguiçoso, tenho uma matéria para entregar e passo o dia inteiro lutando contra o editor de textos. Sabe aqueles dias em que você tem algo para fazer, sabe como, normalmente é capaz de fazer com uma mão nas costas mas de repente simplesmente não consegue? Pois é, hoje era o meu dia ....
     
    Veja o resto do artigo no link a seguir [http://rigues.badcoffee.info/?p=284]
     
     
     
    November 25

    Codificação para e-mail

    Para evitar problemas de caracteres "estranhos", configuramos o charset para "ISO-8859-1"

    Determinando a codificação para o assunto
    objEmail.SubjectEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1")

    Determinando a codificação para o corpo da mensagem
    objEmail.BodyEncoding = System.Text.Encoding.GetEncoding("ISO-8859-1")

    November 23

    Classes de Acesso - MySQL

    Galera vou começar uma série de artigos sobre o desenvolvimento de classes de acesso a bases de dados, irei postar aqui classes para acesso ao MySql (Este post), depois tratarei do PostgreSql e por fim do FireBird.

    Importando os namespaces necessários.
     
    Imports System
      Imports System.Data
      Imports MySql.Data.MySqlClient

     
      Namespace CamadaDados
     
     

    Public Class MySqlClasse

    Criando as instâncias dos Objetos.
      Private MeuDataReader As MySqlDataReader
      Private MeuAdaptador As MySqlDataAdapter
      Private MinhaTransacao As MySqlTransaction
      Private MeuDataTable As DataTable
      Private MeuDataSet As DataSet
      Private MeuDataTableReader As DataTableReader
      Private Conexao, ConexaoTransacao As MySqlConnection
      Private Comando, ComandoTransacao As MySqlCommand
      Private Parametro, ParametroTransacao As MySqlParameter

    Função para criar a conexão, recebendo um parametro que é exatamente a string de conexão.
            Private Function CriarConexao(ByVal StrConexao As String) As MySqlConnection
                Conexao = New MySqlConnection(StrConexao)
                Return Conexao
            End Function     
      
    Função para abrir a conexão existente, perceba que esta é private ou seja acessível apenas dentro da classe.
            Private Function AbrirConexao() As MySqlConnection
                Conexao.Open()
                Return Conexao
            End Function
     
    Função para fechar a conexão, perceba que esta é private ou seja acessível apenas dentro da classe.
            Private Function FecharConexao() As MySqlConnection
                Conexao.Close()
                Return Conexao
            End Function
     
    Função para fechar a conexão, perceba que esta é pública para que seja possível o acesso de fora da classe, recebendo como parâmetro um valor para determinar se deve ser forçado o fechamento ou não.
            Public Function FecharConexao(ByVal ForcarFechamento As Boolean) As Boolean
                If ForcarFechamento Then
                    If Conexao.State = ConnectionState.Open Then
                        Try
                            Conexao.Close()
                            Return True
                        Catch ex As Exception
                            Return False
                        End Try
                    Else
                        Return True
                    End If
                End If
            End Function
     
    Função para criar o comando Sql, recebendo como parametro o comando Sql a ser executado e a String de conexão, que vai ser repassada para a função interna CriarConexao.
            Public Function CriarComando(ByVal StrComando As String, ByVal StrConexao As String) _
                As MySqlCommand
                Comando = New MySqlCommand(StrComando)
                Comando.Connection = CriarConexao(StrConexao)
                Comando.CommandType = CommandType.Text
                Return Comando
            End Function
     
    Função para chamar uma procedure, quando necessário.
            Public Function CriarProcedure(ByVal Strprocedure As String) As MySqlCommand
                Comando = New MySqlCommand(Strprocedure)
                Comando.CommandType = CommandType.StoredProcedure
                Return Comando
            End Function

    Função para criar os parametros do comando ou da procedure, veja que recebe como parâmetros o nome do Parametro, o Valor, o Tipo do parâmetro e o Tamanho.
            Public Function CriarParametro(ByVal StrParametro As String, ByVal StrValor As String, _
                ByVal IntTipo As Integer, ByVal IntTamanho As Integer) As MySqlCommand
                Parametro = New MySqlParameter
                Parametro.ParameterName = StrParametro
                Select Case (IntTipo)
                    Case 1
                        Parametro.MySqlDbType = MySqlDbType.String
                    Case 2
                        Parametro.MySqlDbType = MySqlDbType.Int32
                    Case 3
                        Parametro.MySqlDbType = MySqlDbType.Date
                    Case 4
                        Parametro.MySqlDbType = MySqlDbType.Blob
                    Case 5
                        Parametro.MySqlDbType = MySqlDbType.LongBlob
                    Case 6
                        Parametro.MySqlDbType = MySqlDbType.Datetime
                    Case 7
                        Parametro.MySqlDbType = MySqlDbType.Int64
                    Case 8
                        Parametro.MySqlDbType = MySqlDbType.Timestamp
                    Case 9
                        Parametro.MySqlDbType = MySqlDbType.LongText
                    Case 10
                        Parametro.MySqlDbType = MySqlDbType.Double
                    Case 11
                        Parametro.MySqlDbType = MySqlDbType.Decimal
                    Case 12
                        Parametro.MySqlDbType = MySqlDbType.Year
                    Case Else
                        Parametro.MySqlDbType = MySqlDbType.String
                End Select
                Parametro.Size = IntTamanho
                Parametro.Value = StrValor
                Comando.Parameters.Add(Parametro)
                Return Comando
            End Function
     
    Função para Executar o comando SQL criado anteriormente e retornar os valores num DataReader, lembrando que não posso fechar a conexão aqui, pois o Objeto DataReader é um objeto do tipo conectado.
            Public Function RetornarDatareader() As MySqlDataReader
                Try
                    AbrirConexao()
                    MeuDataReader = Comando.ExecuteReader
                Catch ex As Exception
                    FecharConexao()
                End Try
                Return MeuDataReader
            End Function
     
    Função para executar o comando Sql criado anteriormente e retornar o resultado num objeto DataTableReader, este Objeto tem a velocidade de um DataReader e as funcionalidades de um DataTable, veja que aqui eu fecho a conexão, ou seja este objeto é desconectado.
            Public Function RetornarDataTableReader(ByVal StrNomeTabela As String) _
            As DataTableReader
                Try
                    AbrirConexao()
                    MeuAdaptador = New MySqlDataAdapter(Comando)
                    MeuDataTable = New DataTable(StrNomeTabela)
                    MeuAdaptador.Fill(MeuDataTable)
                    MeuDataTableReader = MeuDataTable.CreateDataReader
                Catch ex As Exception
                    FecharConexao()
                Finally
                    FecharConexao()
                End Try
                Return MeuDataTableReader
            End Function
     
    Função para executar o comando Sql criado anteriormente e retornar o resultado num objeto do tipo DataTable.
            Public Function RetornarDataTable(ByVal StrNomeTabela As String) As DataTable
                MeuDataTable = New DataTable(StrNomeTabela)
                Try
                    AbrirConexao()
                    MeuAdaptador = New MySqlDataAdapter(Comando)
                    MeuAdaptador.Fill(MeuDataTable)
                Catch ex As Exception
                    FecharConexao()
                Finally
                    FecharConexao()
                End Try
                Return MeuDataTable
            End Function
     
    Função para executar o comando Sql criado anteriormente e retornar o resultado num objeto do tipo DataSet. Por estar trabalhando com desenvolvimento OO não uso esta função na minha aplicação, desenvolvi apenas para deixar a classe completa.
            Public Function RetornarDataSet() As DataSet
                MeuDataSet = New DataSet
                Try
                    AbrirConexao()
                    MeuAdaptador = New MySqlDataAdapter(Comando)
                    MeuAdaptador.Fill(MeuDataSet)
                Catch ex As Exception
                    FecharConexao()
                Finally
                    FecharConexao()
                End Try
                Return MeuDataSet
            End Function
     
    Função para executar comandos que não retornam valores, o inteiro retornado é apenas indicativo da quantidade de registros afetados pelo comando Sql.
            Public Function ExecutarInsertUpdateDelete() As Integer
                Dim Qt As Integer = 0
                Try
                    AbrirConexao()
                    Qt = Comando.ExecuteNonQuery
                Catch ex As Exception
                    FecharConexao()
                Finally
                    FecharConexao()
                End Try
                Return Qt
            End Function
     
    Função para executar comandos Sql que retornam apenas um registro (Agregação), como Sum, Count, retornar também a chave primária do registro. Este comando é bem performático.
            Public Function ExecutarEscalar() As String
                Dim Retorno As String = ""
                Try
                    AbrirConexao()
                    Retorno = CType(Comando.ExecuteScalar, String)
                Catch ex As Exception
                    FecharConexao()
                Finally
                    FecharConexao()
                End Try
                Return Retorno
            End Function
     

    End Class

    End Namespace