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

Blog


    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
     
    July 10

    Componente Menu

    Criando um Menu baseado em arquivos SiteMap.

    Neste artigo vou falar sobre o desenvolvimento de um menu para o seu site baseado em arquivos sitemap. Primeiramente temos que criar o(s) arquivo(s) sitemap, que no final deve ter o formato abaixo.

    <?xml version="1.0" encoding="utf-8" ?>
    <siteMap xmlns="http://schemas.microsoft.com/AspNet/SiteMap-File-1.0" >
    <siteMapNode url="" title="Administrador" description="">
    <siteMapNode title="Principal" url="~/admsistema/frm_principal.aspx" description="Página inicial do sistema"/>
    <siteMapNode title="Cadastrar usuário" url="~/admsistema/frm_cadastrar_usuario.aspx" description=""/>
    <siteMapNode title="Manutenção" url="" description="">
    <siteMapNode title="Vara" url="~/admsistema/frm_atualizar_vara.aspx" description="Administrar vara"/>
    </siteMapNode>
    <siteMapNode title="Sair" url="~/admsistema/frm_logoff.aspx" description="Sair do sistema"/>
    </siteMapNode>
    </siteMap>

    ' Explicando o formato do arquivo
    Cada item siteMapNode será um item do menu, percebe-se que os itens estão aninhados, onde tenho nós pais como por exemplo <siteMapNode title="Principal" url="~/admsistema/frm_principal.aspx" description="Página inicial do sistema"/> que será um item do menu, e temos nós filhos como por exemplo <siteMapNode title="Vara" url="~/admsistema/frm_atualizar_vara.aspx" description="Administrar vara"/> que no caso só será visto no momento em que o usuário passar o mouse por cima do nó pai. Para configurar um nó filho deve-se tomar o cuidado de colocá-lo internamento entre a tag <siteMapNode> e </siteMapNode>.

    Mas isto é apenas para demonstrar a estrutura do arquivo, visto que o próprio Visual Studio gera toda a estrutura do arquivo.

    ' Configurando o web.config
    Para se trabalhar com os arquivos siteMap temos que fazer a inserção de uns parâmetros no nosso web.config, mas é coisa bem simples mesmo, devemos dizer quais arquivos serão usados pela aplicação. Como estamos trabalhando com acesso separados por nível de usuário iremos cadastrar vários arquivos no web.config, onde o defaultProvider vai determinar qual o siteMap padrão para o sistema carregar no componente menu. Para cada arquivo siteMap que desejar usar deve-se adicionar uma tag dentro de providers, no formato destacado abaixo

    <siteMap defaultProvider="Advogado" enabled="true">
    <providers>
    <add name="Advogado" type="System.Web.XmlSiteMapProvider" siteMapFile="~/admsistema/Advogado.SiteMap"/>
    <add name="Administrador" type="System.Web.XmlSiteMapProvider" siteMapFile="~/admsistema/Administrador.SiteMap"/>
    <add name="Secretaria" type="System.Web.XmlSiteMapProvider" siteMapFile="~/admsistema/Secretaria.SiteMap"/>
    <add name="Socio" type="System.Web.XmlSiteMapProvider" siteMapFile="~/admsistema/Socios.SiteMap"/>
    <add name="Estagiario" type="System.Web.XmlSiteMapProvider" siteMapFile="~/admsistema/Estagiario.SiteMap"/>
    <add name="Cliente" type="System.Web.XmlSiteMapProvider" siteMapFile="~/admsistema/Cliente.SiteMap"/>
    </providers>
    </siteMap>

    ' Determinando via código qual o siteMap a ser carregado no componente Menu.
    Na página aspx vamos inserir o componente menu, e também um siteMapDataSource como abaixo

    <asp:SiteMapDataSource ID="SMDS" SiteMapProvider="Advogado" runat="server" ShowStartingNode="False" />

    Veja que estou determinando qual o siteMapProvider vou usar inicialmente Advogado ou seja o mesmo nome que deu para o meu primeiro SiteMap, a referencia deve ser feita usando o parâmetro name dos providers inseridos no web.config.

    Por fim vamos carregar um siteMap diferenciado. Para isto basta carregar via código o provider que eu quero usar.

    SMDS.SiteMapProvider = "Administrador"

    Assim o sistema vai carregar o siteMap do usuário adminsitrador.

    ' Configuração do asp:menu na página aspx
    Já a Tag com a configuração do Menu está logo abaixo, onde devemos destacar o DataSourceID, que deve apontar para o SiteMapDataSource configurado logo acima. Outro parâmetro que vale destacar é o Orientation que determina se o menu vai ser exibido na horizontal ou vertical. Os parâmetros em verde são estilos css para os estados dos objetos do menu, como o HoverStyle que vai aplicar um estilo quando o mouse estiver sobre o elemento.


    <asp:Menu ID="MenuSistema" runat="server" DataSourceID="SMDS" Orientation="Horizontal" DynamicEnableDefaultPopOutImage="False" StaticEnableDefaultPopOutImage="False" DynamicVerticalOffset="5" Height="25px">
                    <DynamicMenuItemStyle CssClass="cssmenuxmlsubmenu" />
                    <StaticMenuItemStyle CssClass="cssmenuxmlitens" />               
                    <DynamicHoverStyle CssClass="cssmenusubitenshover" />
                    <DynamicMenuStyle CssClass="csssubmenuxml" />
                    <StaticHoverStyle CssClass="cssmenuxmlitenshover" />                 
                </asp:Menu>

    January 25

    Novidades

    Estou de volta a Palmas, agora casado e muito feliz. Arrumando a casa ainda mas muito tranquilo e feliz. Mas hoje quero falar de um assunto que muitos perguntam, "Como fazer um Select dentro de um DataTable"
     
    Para isto vamos precisar de alguns itens.
     
    1 - 1 DataTable (Vai conter todos os dados retornados da consulta Sql)
    2 - 1 DataRow (Linha que vai conter o resultado do Select dentro do DataTable)
     
    Agora é simples.
     
    DataRowResultado = DataTableOriginal.Select("Campo1doDataTable='ValorASerBuscado1' and Campo2doDataTable='ValorASerBuscado2')
     
    Ai temos uma consulta Select dentro de um DataTable.
    December 17

    Primeiro post

    Neste primeiro post, que faço do aeroporto de palmas, quero falar do maior evento da minha vida, que é meu casamento. Estou indo para Jampa daqui a alguns minutos e no dia 22 me caso com Vi. Quando chegar em brasília eu post outra mensagem, mas não pensem q este space vai tratar disto, porque vou usar este espaço para falar sobre .net e sobre minha batalha contra o mundo do PHP na prefeitura aqui de Palmas.