Article Details                  
 
Conectando o Pocket com BD SQLCE

O SQL Server 2000 Windows CE Edition 2.0 (SQLCE) é um subset do SQL Server 2000 criada exclusivamente para atuar em dispositivos móveis. Neste artigo, procurarei esclarecer dúvidas relacionadas com a conexão entre o Pocket e a BD SQLCE.

Diariamente recebo muitos e-mails com pedidos de ajudas dos mais variados assuntos, mas um em comum me chama a atenção: Conexão com BD SQLCE!

O SQL Server 2000 Windows CE Edition 2.0 (SQLCE) é um subset do SQL Server 2000 criada exclusivamente para atuar em dispositivos móveis (como Pockets e SmartPhones - disponível na versão 2.0 da Compact Framework). Por se tratar de um subset, algumas caracteristicas disponíveis no SQL Server 2000 não estão presentes na versão CE. Uma das que chamam atenção, é impossibilidade de criação de Stored Procedures, Views e Functions. Em contrapartida, o core do sistema foi totalmente reescrito para aproveitar com a maior performance possível os recursos limitados que os processadores dos disposivos móveis possuem.
Podemos assim, ter um Banco de Dados relacional, otimizado para cada processador, com ótimo controle de uso de memória em um arquivo relativamente pequeno e rápido.

Para os desenvolvedores que já estão familiarizados com a metodologia de desenvolvimento com SQL Server 2000, o impácto será irrelevante. O SQLCE oferece uma sintaxe de comandos idênticos ao SQL Server. Baseado na DDL (Data Definition Language) provê a mesma gramática usada no SQL Server 2000 para a criação de tabelas. Com suporte a DML (Data Manipulation Language) provê a mesma gramática para a execução de comandos SELECT, DELETE e UPDATE, bem como o uso de UNION para a mesclagem de várias querys e execução de querys parametrizadas.

O SQLCE oferece ainda métodos de conexão com servidores SQL Server 2000 para a migração de dados de duas maneiras: RDA (Remote Data Access) e Merge Replication.

Neste artigo, procurarei esclarecer essas dúvidas tão comuns entre os iniciantes na programação para dispositivos móveis, com a utilização de um exemplo prático: Um sistema pra Pocket que seja capaz de criar um Banco de Dados se ele não exisitr, criar uma conexão com o referido banco de dados, criar e popular sua tabela e executar comandos para retornar os dados armazenados no BD.

O sistema apresentado, será semelhante ao mostrado na Figura 1:







Figura 1 - Exemplo de construção do sistema descrito no artigo.

Os primeiros passos para a construção de nosso sistema, é a correta referência aos Names Spaces necessários para a conexão com o SQLCE. Para isso, clique com o botão da direita do mouse sobre o nome do projeto na janela Solution Explorer, e clique em Add references...
A Figura 2 mostra como será a tela exibida:







Figura 2 - O Name Space System.Data.SQLServerCE deverá ser selecionado no panel Component Name. Após selecionado, clique no botão Select. O name space será mostarado no Panel Selected Components. Clique em OK para fechar a janela.

Após feita a referência, um name space deverá ser mostrado na sua Solutions Explorer como visto na Figura 3:







Figura 3 - O name espace System.Data.SQLServerCE é mostrado nas referências do projeto.

Agora que a referência esta feita, podemos partir para a codificação da aplicação.
O primeiro passo para a codificação é importar duas classes: System.Data.SQLServerCE e System.IO. O import serve para que não seja necessário informar o caminho completo do name space a cada uso de um metodo de uma classe. Abaixo, segue o código utilizado na aplicação, e sua devida explicação:







    
'Faz o import dos métodos da classe SqlServerCe
'Pra que isso seja possível, a classe System.Data.SqlServerCe deve ser referênciada
'no Projeto, clicando com o botão da direita do mouse no seu projeto na janela
'Solution Explorer e escolhendo a opção Add References...
Imports System.Data.SqlServerCe
 
'Faz oo import do metodos da classe System.IO para funções de I/O
Imports System.IO
 
Public Class frmBD
    Inherits System.Windows.Forms.Form
    Friend WithEvents btnCriarBD As System.Windows.Forms.Button
    Friend WithEvents btnConecarBD As System.Windows.Forms.Button
    Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu
 
    'Essa variavel contém o path onde será criado o BD
    Dim BDPath As String = "\My Documents\BDDados.sdf"
 
    'Uma variavél é criada para instanciar o objeto de conexão com o BD
    Dim Conn As SqlCeConnection
 
    'Função para escrever o status de cada processamento.
    'Apenas concatena o texto desejado com o prefixo Status:
    Private Function ShowStatus(ByVal Texto As String)
        lblStatus.Text = "Status: " & Texto
    End Function
 
    Private Sub btnCriarBD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriarBD.Click
        Try
            'Coloca o cursor em modo de espera
            'Esse sistema é utilizado para informar um processamento ao usuário
            Cursor.Current = Cursors.WaitCursor
 
            'Escreve o Status no label de status utilizando a função criada acima.
            ShowStatus("Criando Banco de Dados...")
 
            'Chamada da procedure que cria o BD e sua estrutura caso ele não exista
            CriaBD()
 
            'Escreve o Status no label de status utilizando a função criada acima.
            ShowStatus("Banco de Dados criado com sucesso !")
 
            'Coloca o cursor em estado Default - padrão do sistema
            Cursor.Current = Cursors.Default
        Catch ex As Exception
            'Caso ocorra algum tipo de erro, o mesmo será retratado em um MSGBOX
            MsgBox("Erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
 
    Private Sub CriaBD()
        Try
            'Caso o arquivo do BD não exista, o mesmo é criado no caminho
            'informado na variavel BDPath
            If Not File.Exists(BDPath) Then
                Dim SQLEngine As New SqlCeEngine("Data Source=" & BDPath)
                SQLEngine.CreateDatabase()
            End If
        Catch
            'Caso algum erro ocorra, o mesmo será redirecionado para tratamento
            'na rotina que chamou essa SUB, no caso o click do botão Criar BD.
            Throw
        End Try
    End Sub
 
    Private Sub btnConecarBD_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConecarBD.Click
        Try
            'Caso a conexão esteja fechada, será possível conectar com o BD
            If Conn.State = ConnectionState.Closed Then
 
                'Coloca o cursos em estado de espera (ampulieta rodando na tela)
                Cursor.Current = Cursors.WaitCursor
 
                'Escreve o status do label de status
                ShowStatus("Conectando com Banco de Dados...")
 
                'Inicia uma nova instancia de conexão com o banco de dados
                ' informado na variavel BDPath
                Conn = New SqlCeConnection("Data Source=" & BDPath)
 
                'Abre a conexão
                Conn.Open()
 
                'Escreve o status do label de status
                ShowStatus("Conexão estabelecida com sucesso !")
 
                'Coloca o cursor em estado Default - padrão do sistema
                Cursor.Current = Cursors.Default
            End If
        Catch ex As Exception
            'Caso ocorra algum tipo de erro, o mesmo será retratado em um MSGBOX
            MsgBox("Erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
 
    Private Sub btnCriaTabelas_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCriaTabelas.Click
        Try
            'Coloca o cursos em estado de espera (ampulieta rodando na tela)
            Cursor.Current = Cursors.WaitCursor
 
            'Escreve o status do label de status
            ShowStatus("Criando Tabelas e dados...")
 
            'Cria uma nova instancia do objeto Command para execução
            'de comandos no Banco de Dados
            Dim cmd As New SqlCeCommand( _
                "CREATE TABLE Livros(IDLivro int IDENTITY Primary Key NOT NULL," & _
                                    "Titulo nvarchar(80) NOT NULL," & _
                                    "Autor nvarchar(80) NOT NULL," & _
                                    "Editora nvarchar(50), " & _
                                    "Preco money NOT NULL)", Conn )
 
            'Executa o comando informado acima - no caso a criação de uma Tabela
            cmd.ExecuteNonQuery()
 
            'Idem a primeira execução
            cmd.CommandText = "INSERT INTO Livros(Titulo," & _
                              "Autor,Editora,Preco)" & _
                              "VALUES('ASP.NET: Guia do Desenvolvedor'," & _
                              "'FELIPE CEMBRANELLI'," & _
                              "'Novatec'," & _
                              "38.90)"
 
            'Idem a primeira execução
            cmd.ExecuteNonQuery()
 
            'Idem a primeira execução
            cmd.CommandText = "INSERT INTO Livros(Titulo," & _
                              "Autor,Editora,Preco)" & _
                              "VALUES('ASP.NET com C#: Curso Prático'," & _
                              "'ALFREDO LOTAR'," & _
                              "'Novatec'," & _
                              "51.90)"
 
            'Idem a primeira execução
            cmd.ExecuteNonQuery()
 
            'Idem a primeira execução
            cmd.CommandText = "INSERT INTO Livros(Titulo," & _
                              "Autor,Editora,Preco)" & _
                              "VALUES('COM+ e .NET'," & _
                              "'JUVAL LOWY'," & _
                              "'Campus'," & _
                              "82.90)"
 
            'Idem a primeira execução
            cmd.ExecuteNonQuery()
 
            'Destoi a alocação para o objeto command utilizado acima
            cmd.Dispose()
 
            'Escreve o status do label de status
            ShowStatus("Tabelas e Dados criados com sucesso !")
 
            'Coloca o cursor em estado Default - padrão do sistema
            Cursor.Current = Cursors.Default
        Catch ex As Exception
            'Caso ocorra algum tipo de erro, o mesmo será retratado em um MSGBOX
            MsgBox("Erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
 
    Private Sub btnFechaConexao_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnFechaConexao.Click
        Try
            'Caso a conexão esteja aberta, ela poderá ser finalizada
            If Conn.State = ConnectionState.Open Then
 
                'Coloca o cursos em estado de espera (ampulieta rodando na tela)
                Cursor.Current = Cursors.WaitCursor
 
                'Fecha a conexão que estiver ativa
                Conn.Close()
 
                'Destoi a alocação para o objeto Connection
                Conn.Dispose()
 
                'Escreve o status do label de status
                ShowStatus("Conexão finalizada com sucesso !")
 
                'Coloca o cursor em estado Default - padrão do sistema
                Cursor.Current = Cursors.Default
            End If
        Catch ex As Exception
            'Caso ocorra algum tipo de erro, o mesmo será retratado em um MSGBOX
            MsgBox("Erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
    Private Sub btn1Registro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn1Registro.Click
        Try
            ''Coloca o cursos em estado de espera (ampulieta rodando na tela)
            Cursor.Current = Cursors.WaitCursor
 
            'Cria uma nova instância para a execução de um comando no BD.
            'O valor ? informado na Query, indica que o parametro será
            'passado utilizando o Parameters (Querys Parametrizadas).
            'Esse recurso aumenta muito a performânce das querys.
            Dim cmd As New SqlCeCommand("SELECT * FROM Livros WHERE Autor=?", Conn )
 
            'Adiciona o Parâmetro informado na Query.
            'NOTA - Se existir mais de um parâmetro, os mesmos devem ser informados
            'em ordem de programação.
            'A versão 2.0 do SQLCE não suporta Parâmetros Nomeados.
            cmd.Parameters.Add(New SqlCeParameter("Autor", "FELIPE CEMBRANELLI"))
 
            'O Retorno da execução do Comando montado nas linhas acima,
            'é retornado na forma de um Data Reader e armazenado no objeto DR (instãncia do SQLCeDataReader).
            Dim DR As SqlCeDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)
 
            'Se existirem dados, as informações são repassadas para os Labels.
            If DR.Read Then
 
                'Labels recebe, os valores que estão armazenados no Banco de Dados.
                lblTitulo.Text = DR.Item("Titulo").ToString
                lblAutor.Text = DR.Item("Autor").ToString
                lblEditora.Text = DR.Item("Editora").ToString
                lblPreco.Text = DR.Item("Preco").ToString
            End If
 
            'Fecha o objeto DR após o uso
            DR.Close()
 
            'Destoi a alocação para o objeto DR
            DR.Dispose()
 
            '='Destoi a alocação para o objeto Connection
            cmd.Dispose()
 
            'Coloca o cursor em estado Default - padrão do sistema
            Cursor.Current = Cursors.Default
        Catch ex As Exception
            'Caso ocorra algum tipo de erro, o mesmo será retratado em um MSGBOX
            MsgBox("Erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
 
    'As mesmas explicações das linhas acima valem para essa SUB
    Private Sub btn2Registro_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btn2Registro.Click
        Try
            Cursor.Current = Cursors.WaitCursor
            Dim cmd As New SqlCeCommand("SELECT * FROM Livros WHERE Autor=?", Conn )
            cmd.Parameters.Add(New SqlCeParameter("Autor", "ALFREDO LOTAR"))
            Dim DR As SqlCeDataReader = cmd.ExecuteReader(CommandBehavior.SingleRow)
            If DR.Read Then
                lblTitulo.Text = DR.Item("Titulo").ToString
                lblAutor.Text = DR.Item("Autor").ToString
                 lblEditora.Text = DR.Item("Editora").ToString
                lblPreco.Text = DR.Item("Preco").ToString
            End If
            DR.Close()
            DR.Dispose()
            cmd.Dispose()
            Cursor.Current = Cursors.Default
        Catch ex As Exception
            MsgBox("Erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
    'Na hora que o formulários for fechado,
    'caso a conexão esteja ativa, será fechada
    Private Sub frmBD_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
        Try
            'Se a conexão estiver aberta, então permitirá o fechamento da mesma
            If Conn.State = ConnectionState.Open Then
                Cursor.Current = Cursors.WaitCursor
                Conn.Close()
                Conn.Dispose()
                ShowStatus("Conexão finalizada com sucesso !")
                Cursor.Current = Cursors.Default
            End If
        Catch ex As Exception
            MsgBox("Erro: " & ex.Message, MsgBoxStyle.Critical)
        End Try
    End Sub
End Class
 

Atenção - Para copiar e utilizar o código visto acima, copie-o para o Bloco de Notas, e em seguida para o Visual Studio assim, as tags de formatação não serão consideradas.

Espero que com esse artigo, muitas das dúvidas com relação a conexão com Banco de Dados SQLCE sejam esclarecidas!

Um abraço, e até a próxima !
Max Mosimann Netto

Written By: labreu
Date Posted: 4/14/2006
Number of Views: 531

Return