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