Desenvolvimento - Mobile

Desenvolvendo Aplicações para Pocket PC utilizando SQL Server CE com Visual Studio .NET 2003 Final Beta

Em fase final do seu desenvolvimento o Visual Studio .NET 2003 Final Beta traz consigo duas novas formas de desenvolvimento, o Smart Device Extensions (SDE) com Microsoft .NET Compact Framework e o J#, incluindo o SQL Server 2000 CE Edition 2. O SQL Server CE é uma extensão da versão desktop do SQL Server 2000 para dispositivos, rodando no sistema operacional Windows CE.Nesse mesmo tempo a Microsoft esta oferecendo a família de desenvolvedores um modelo de programação para desktop.Neste artigo exploraremos o SQL Server CE Edition 2 e como ele pode ser usado no desenvolvimento de aplicações para Pocket PC utilizando o Smart Device Extensions (SDE) do Visual Studio .NET 2003 Final Beta.

por Maycol Sneider Romelli



Em fase final do seu desenvolvimento o Visual Studio .NET 2003 Final Beta traz consigo duas novas formas de desenvolvimento, o Smart Device Extensions (SDE) com Microsoft .NET Compact Framework e o J#, incluindo o SQL Server 2000 CE Edition 2. O SQL Server CE é uma extensão da versão desktop do SQL Server 2000 para dispositivos, rodando no sistema operacional Windows CE.Nesse mesmo tempo a Microsoft esta oferecendo a família de desenvolvedores um modelo de programação para desktop.Neste artigo exploraremos o SQL Server CE Edition 2 e como ele pode ser usado no desenvolvimento de aplicações para Pocket PC utilizando o Smart Device Extensions (SDE) do Visual Studio .NET 2003 Final Beta.

Um pequeno overview da arquitetura do .NET Compact Framework

O .NET Compact Framework (.NET CF) é um subset do .NET Framework.O benefício é que os programadores tenham a mesma facilidade no desenvolvimento de aplicações para dispositivos móveis utilizando a mesma IDE e qualquer uma das linguagens que o Visual Studio .NET 2003 Final Beta dispõe utilizando toda a tecnologia .NET Class Library, entretanto não são todas as classes e métodos que se encontram no .NET Framework que são suportadas dentro do .NET Compact Framework Class Library.A figura 1 mostra o .NET CF.

Componentes do .NET Compact Framework - em marrom

Figura 1: Componentes do .NET Compact Framework - em marrom

A plataforma permite que aplicações nativas Windows CE co-existam com aplicações baseadas em .NET.O Aplication Domain Host ( aplicação nativa ) cria uma instância da CLR para executar código gerenciado.Aplicações desenvolvidas com o SDE executam no topo da CLR, utilizando o .NET Compact Framework Class Library.

Construindo uma Aplicação Simples

Uma aplicação simples que será construída neste exemplo ilustra alguns aspectos da programação para Pocket PC utilizando o .NET CF.Será ilustrado como pode ser consumido um Web Service dentro do .NET CF, o uso de vários controles e a construção de um banco de dados utilizando o SQL Server CE.A aplicação de exemplo foi desenvolvida para "força de vendas" para ser utilizada com Pocket PC para a pesquisa de livros utilizando um Web Service e para a colocação dos pedidos nas livrarias.Os pedidos serão guardados dentro do SQL Server CE local.

Web services

Figura 2

Web Services

Nosso Web Service faz o uso do banco de dados Pubs dentro do SQL Server 2000 que já vem pré-instalado.

O Web Service contém um Web Method de nome PesquisaTítulos():

<%@ WebService Language="VB" Class="Service1" %>

Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Web.Services

Public Class Service1 : Inherits WebService 

  <WebMethod()> _
  Public Function PesquisaTítulos ( _
    ByVal title As String) As DataSet
 
    " Database Connection
    Dim conn As New SqlConnection( _
      "server=localhost; uid=sa;" & _
      "password=; database=Pubs")

    " Passa parâmetros ao SQL
    Dim sql As String = "SELECT * FROM " & _
      "titles WHERE title LIKE @title"
    Dim comm As New SqlCommand(sql, conn)
    comm.Parameters.Add("@title", _
                        "%" & title & "%")

    " Cria um data adapter e um data set.
    Dim dataAdapter As New SqlDataAdapter(comm)
    Dim ds As New DataSet()

    " Carrega um data set com o resultado da query.
    conn.Open()
    dataAdapter.Fill(ds, "titles")
    conn.Close()

    " Retorna um dataset.
    Return ds

  End Function

End Class

O Web Method PesquisaTítulos() recebe uma string e retorna um dataset contendo todos os títulos dos livros conforme critério da pesquisa.

Usando o Smart Device Extensions (SDE) do Visual Studio .NET 2003 Final Beta

Após o Web Service criado criaremos uma aplicação para Pocket PC utilizando o SDE.

A aplicação para Pocket PC consiste de uma tab control com três tabpages.A primeira tabpage mostra os dados do Autor, a segunda tabpage permite que os vendedores consultem os títulos dos livros e envie os pedidos as livrarias.A terceira tabpage lista os pedidos e ordena por livrarias.A figura 2 mostra todos os controles usados nos formulários.Os controles usandos são Label, TextBox, Button, ComboBox, ListBox e Tab Controls.

A tabpage Títulos e a tabpage Ordens

Figura 3: A tabpage Títulos e a tabpage ordens

Quando o primeiro formulário é carregado, eu preciso checar se o Pocket PC contém a database para armazenar as informações das livrarias.Se não estiver, eu usarei o objeto SQL Server CE Engine para criar a base de dados.Para conectar a uma base de dados do SQL Server CE, nós precisamos usar o SQL Server CE Managed Provider.Então nós precisamos adicionar uma referência ao nosso projeto System.Data.SqlServerCe.dll e importar o namespace Imports System.Data.SqlServerCe (no Visual Basic .NET).

Adicionando a Reference para o SQL Server CE Managed Provider

Figura 4: Adicionando a Reference para o SQL Server CE Managed Provider

Uma vez criada a base de dados, eu preciso criar as tabelas.Para manipular as tabelas utilizo as classes do ADO .NET, nesses casos utilizamos as classes do SQL Server CE Managed Provider - SqlCeConnection, SqlCeCommand e SqlCeEngine.

" conn e ds são definidos como globais
Public conn As SqlCeConnection
Public ds As DataSet

Sub CriaBookStoreDB()

    "--- o banco de dados não existe, cria um 
    "--- com o nome BookStore.sdf dinamicamente 
    If Not File.Exists("BookStore.sdf") Then
            
 Dim sqlEngine As New SqlCeEngine( _
           "Data Source=" & _
           "\My Documents\BookStore.sdf")
           sqlEngine.CreateDatabase()

       " conn e ds são definidos como globais
       Dim conn As New SqlCeConnection("Data Source = \My  Documents\BookStore.sdf;")
       conn.Open()

       Dim cmd As New SqlCeCommand( _
         "CREATE TABLE Stores(storeID int " & _
         "Primary Key NOT NULL, " & _
         "storeName nvarchar(20))", conn)

       cmd.ExecuteNonQuery()
       cmd.CommandText = _
         "CREATE TABLE Orders(storeID int, " & _
         "title_id nvarchar(20), qty int)"
       cmd.ExecuteNonQuery()

       cmd.CommandText = _
         "INSERT INTO Stores (storeID, " & _
         "storeName) VALUES (1, " & _
         ""Livraria Sici")"
       cmd.ExecuteNonQuery()

       cmd.CommandText = _
         "INSERT INTO Stores (storeID, " & _
         "storeName) VALUES (2, " & _
         ""Livraria Sara")"
       cmd.ExecuteNonQuery()
       conn.Close()

       Call LoadStores()

   End If
End Sub

Na figura abaixo, eu crio duas tabelas, Orders e Stores.A tabela Orders guarda os pedidos das livrarias e a tabela Stores contém a lista de livrarias.Eu tenho que popular a tabela Stores com 2 registros.

Relacionamento entre as tabelas Stores e Orders

Figura 5: Relacionamento entre as tabelas Stores e Orders

O próxima passo é ler a lista de livrarias e mostrar na ComboBox usando a classe SqlCeDataReader.

Sub LoadStores()
  Dim conn As New SqlCeConnection("Data Source = \My Documents\BookStore.sdf;")
  conn.Open()
  Dim reader As SqlCeDataReader
  Dim cmd As New SqlCeCommand( _
    "SELECT * FROM Stores", conn)
  reader = cmd.ExecuteReader
  While reader.Read
      cboStoreID.Items.Add( _
        reader.Item("storeID"))
  End While
  conn.Close()
End Sub

Assim, quando o Form estiver carregado, a ComboBox estará preenchida com a lista das livrarias:

Populando a ComboBox

Figura 6: Populando a ComboBox

Após selecionado o Store ID, o nome da loja será exibido:

Private Sub cboStoreID_SelectedIndexChanged( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
Handles cboStoreID.SelectedIndexChanged

  Dim conn As New SqlCeConnection("Data Source = \My Documents\BookStore.sdf;")
    conn.Open()
    Dim sql As String = _
      "SELECT * FROM Stores WHERE storeID=" & _
       cboStoreID.Items(cboStoreID.SelectedIndex)
    Dim cmd As New SqlCeCommand(sql, conn)
    Dim reader As SqlCeDataReader = cmd.ExecuteReader
    reader.Read()
    lblStoreName.Text = reader.Item("storeName")
    conn.Close()
End Sub

Consumindo o Web Service

Para procurar títulos específicos, nossa aplicação usará o Web Service. Para consumir um Web Service dentro do .NET CF ( não há diferença em consumir com o .NET Framework ) selecione o projeto no Solution Explorer, click com o botão direito Add Web Reference, e escolha o caminho para o WSDL, é necessário passar o nome da máquina pois o Beta 1 do SDE não trabalha com localhost.

No arquivo BookStoreApp.zip, a Web Reference precisa ser modificada para trabalhar corretamente com o seu sistema. No Solution Explorer, localize o TitlesWS, selecione, e mude a propriedade Web Reference à URL de WSDL correta (é atualmente http://nome_da_maquina/Services/service1.asmx).

Segue o código do evento click da ComboBox que faz referência ao Web Service para preenchimento da ComboBox.

Private Sub cmdSearch_Click( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
  Handles cmdSearch.Click
    Dim ws As New WebServiceLivrarias.WebServiceLivrarias()
    " busca o web service
    ds = ws.PesquisaTítulos(txtSearch.Text)
    cboResult.DataSource = ds.Tables(0)
    cboResult.DisplayMember = "title"
End Sub

Como sempre, quando um título é selecionado, é exibido mais informação sobre o título selecionado nos labels controls:

Private Sub cboResult_SelectedIndexChanged( _
    ByVal sender As System.Object, _
    ByVal e As System.EventArgs) _
    Handles cboResult.SelectedIndexChanged
    " display a informação do livro 
    " selecionado
    Dim row As DataRow
    row = ds.Tables("titles").Rows( _
      cboResult.SelectedIndex)
    lblTitleID.Text = row.Item("title_id")
    lblPrice.Text = "$" & row.Item("price")
    txtNotes.Text = row.Item("notes")
End Sub
Exibindo Informações após o título selecionado

Figura 7: Exibindo Informações após o título selecionado

Fazer um pedido para uma livraria, especifique a quantidade e clique em Adicionar. Uma ordem para a livraria selecionada será enviada:

Private Sub cmdAdd_Click( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
Handles cmdAdd.Click

  Dim conn As New SqlCeConnection("Data Source = \My Documents\BookStore.sdf;")
    "--- Adiciona o título 
    conn.Open()
    Dim sql As String = "INSERT INTO Orders " &_
      "(storeID, title_id, Qty) VALUES (" & _
      cboStoreID.Items(cboStoreID.SelectedIndex) _
      & ","" & _
      lblTitleID.Text & ""," & txtQty.Text & ")"
    Dim cmd As New SqlCeCommand(sql, conn)
    cmd.ExecuteNonQuery()
    MsgBox("Title added for " & lblStoreName.Text, _
      MsgBoxStyle.Information, "Orders")
    conn.Close()
End Sub

Uma message box confirma a inclusão:

Confirmando a inclusão

Figura 8: Confirmando a inclusão

Checando as Ordens

Clicando na segunda tabpage, as orders feitas nas livrarias seram visualizadas.Ao clicar no botão Refresh a primeira ComboBox trará as livrarias disponíveis.

Private Sub cmdRefresh_Click( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
Handles cmdRefresh.Click
  Dim conn As New SqlCeConnection("Data Source = \My Documents\BookStore.sdf;")
"--- Mostra a lista
conn.Open()
    Dim sql As String = "SELECT * FROM Stores"
    Dim cmd As New SqlCeCommand(sql, conn)
    Dim reader As SqlCeDataReader = _
      cmd.ExecuteReader
    "---Apaga o listbox
    cboStoreIDs.Items.Clear()
    While reader.Read()
        cboStoreIDs.Items.Add( _
          reader.Item("storeID"))
    End While
    conn.Close()
End Sub

Ao escolher a livraria a segunda ComboBox trará as suas ordens com a quantidade de cada livro solicitado.

Private Sub cboStoreIDs_SelectedIndexChanged( _
  ByVal sender As System.Object, _
  ByVal e As System.EventArgs) _
  Handles cboStoreIDs.SelectedIndexChanged
"---displays the orders of store selected
Dim conn As New SqlCeConnection("Data Source = \My Documents\BookStore.sdf;")
    conn.Open()
    Dim sql As String = _
      "SELECT * FROM Orders WHERE storeID=" & _
      cboStoreIDs.Items(cboStoreIDs.SelectedIndex)
    Dim cmd As New SqlCeCommand(sql, conn)
    Dim reader As SqlCeDataReader = _
      cmd.ExecuteReader()
    "---clears the listbox
    cboOrders.Items.Clear()
    While reader.Read()
        cboOrders.Items.Add( _
          reader.Item("title_id") & " - " & _
          reader.Item("qty") & "-copy(ies)")
    End While
    conn.Close()
End Sub
Mostra as Ordens

Figura 9: Mostra as Ordens

Outra forma de você visualizar se as suas tabelas de seu banco de dados foram atualizadas corretamente no SQL Server CE 2.0, existe uma ferramenta conhecida como SQL Server CE Query Analyzer. A primeira vez que sua aplicação é executada é referenciado o SQL Server CE Managed Provider, e o SDE se incumbi de copiar para seu dispositivo os arquivos ao emulador.O SQL Server CE Query Analyzer pode ser invocado clicando em Star-> SQLCE Query (Veja na Figura).

Usando o SQL Server CE Query Analyzer

Figura 10: Usando o SQL Server CE Query Analyzer

Para conectar ao banco de dados SQL Server CE, click no botão e selecione-o.

Conectando ao banco de dados do SQL Server CE

Figura 11: Conectando ao banco de dados do SQL Server CE

Você pode conectar a um banco de dados existente ou pode criar um novo. Neste artigo, mostrarei como nós podemos examinar o banco de dados que nós criamos.

A figura abaixo mostra as tabelas e campos do banco de dados criado:

Examinando o banco de dados  BookStores.sdf

Figura 12: Examinando o banco de dados BookStores.sdf

Para retornar os registros das tabelas, você pode usar as declarações do SQL debaixo da aba de SQL e pode examinar os resultados debaixo da aba da grade:

Usando SQLStatements e examinando os resultados

Figura 13: Usando SQLStatements e examinando os resultados

Uma característica do Query Analyzer é a função "Button Presets". O Button Presets permite armazenar declarações de SQL geralmente usadas, de forma que as declarações possam ser invocadas simplesmente fazendo click nos botões prefixados (label 1-10).

Usando o Preset button para armazenar declarações de SQL statements geralmente usadas

Figura 14: Usando o Preset button para armazenar declarações de SQL statements geralmente usadas

Abrindo e Fechando

Você também pode notar que a aplicação abre e fecha conexões de banco de dados antes e depois de cada operação.

Deployment

O deployment pode ser feito de duas formas são elas:

- Microsoft ActiveSync

Após conectar o cabo na USB do computador ou notebook, o ActiveSync mostrará como status ( conectado ) estando apto portanto a receber os arquivos que o Visual Studio .NET 2003 Final Beta enviará. Sua máquina precisa ter uma placa de loopback com no. de IP fixo.

- Wireless

Será obrigatório ter duas placas wireless sendo cada uma com um no. de IP fixo, uma no computador ou notebook e outra no Ipaq ou Windows CE, configurando-a ponto a ponto. Para efetuar o deployment através de wireless troque as propriedades do seu VS .NET, click em Tools/Options/Device Extensions, Transport como TCP Connect Transport, Startup Server como ActiveSync Startup Provider e click em Configure e configure o IP do seu Ipaq ou Windows CE veja como abaixo:

Configurando Transport para TCP Connect  Transport

Figura 15: Configurando Transport para TCP Connect Transport

Configurando IP da placa Wireless do Pocket PC para o Deployment

Figura 16: Configurando IP da placa Wireless do Pocket PC para o Deployment

Conclusão

Neste artigo, nós vimos como usar o SDE no Visual Studio .NET 2003 Final Beta para criar uma simples aplicação usando Pocket PC, consumindo um Web Service e utilizando o SQL Server CE Edition 2.Até o próximo artigo...

Sobre o Author

Maycol Sneider Romelli é integrante do Seminar Group Microsoft Brasil, aonde ministra palestras na área de desenvolvimento.

Para contactá-lo maycolromelli@hotmail.com.

Maycol Sneider Romelli

Maycol Sneider Romelli - Integrante de D&PE da Microsoft Brasil, aonde ministra palestras na área de desenvolvimento, é também escritor de várias revistas e sites no Brasil como: Revista MSDN Magazine, Revista Desenvolvedor, Revista SQL Magazine, Revista Developers Magazine, Site MSDN Brazil, Site Linha de Código e Site Portal Web Mobile. Colaborou também com as extintas revistas .NET Magazine e VSPJ.