BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki

Baza wiedzy











Baza danych na palmtopie, czyli Pocket PC i SQL Serwer CE.

13-06-2004 14:59 | User 79561
Praktyczna aplikacja bazodanowa w języku C# na urządzenia typu Pocket PC.

Jeszcze kilka lat temu o palmtopach mogliśmy czytać jedynie w magazynach komputerowych. Dziś urządzenia typu Pocket PC są chętnie wykorzystywane w wielu firmach i prywatnych domach. Te małe komputery zdobywają rynek ze względu na ich coraz niższą cenę. Charakteryzują się przy tym coraz lepszymi parametrami, które nie rzadko są lepsze od parametrów naszych komputerów sprzed 2 lub 3 lat.

Aby móc w pełni przetestować działającą aplikację Wyniki Egzaminów będziemy potrzebowali zainstalowanych programów:

  • Visual Studio .NET 2002 (wymaga zainstalowania dodatkowych emulatorów Pocket PC)

  • Visual Studio .NET 2003 (zalecane)

  • Microsoft SQL Server 2000 Windows CE Edition

Jeśli chcemy, aby kompilacja przebiegała bez problemów powinniśmy dodatkowo ściągnąć i zainstalować SDK for Windows Mobile 2003-based Pocket PCs. Pakiet ten zawiera niezbędne emulatory urządzeń mobilnych potrzebne do prawidłowego działania naszego programu. W SDK znajdziemy również wiele bardzo cennych informacji na temat programowania aplikacji na Pocket PC.

SQL Serwer CE jest to mobilna, nieco okrojona, wersja SQL serwera 2000. Główne zalety serwera baz danych na urządzenia mobilne to:

  • zgodność składni zapytań sql’owych z serwerem SQL 2000

  • wsparcie dla transakcji

  • szyfrowanie 128 bitowe bazy danych

  • Serwer zaraz po zainstalowaniu zajmuje około 1.6 MB pamięci na dysku urządzenia mobilnego. Maksymalna wielkość bazy danych w SQL Serwerze CE wynosi 2 GB. Zwarzywszy na to, że dzisiejsze palmtopy mają średnio około 128 MB przestrzeni dyskowej to ograniczenie wielkości pliku bazy nie wydaje się być takie poważne. SQL Serwer CE może synchronizować dane z SQL 2000 poprzez replikację lub RDA (Remote Data Access). W każdym z tych przypadków w wymianie informacji pośredniczy serwer IIS. Istniej możliwość skonfigurowania serwera  IIS do pracy zarówno z protokołem HTTP jak i HTTPS. Zagadnienie synchronizacji danych będzie tematem kolejnego mojego artykuły na portalu codeguru.pl .

    Kompilacji możemy dokonywać na emulator lub na fizyczne urządzenie podłączone do komputera. W tym drugim przypadku palmtopa podłączamy przez USB, WiFi lub BlueTooth do komputera na którym mamy zainstalowanie VS .NET. Komunikacja następuje za pośrednictwem programu ActiveSync, jego najnowsza wersja to 4.7.1. Pamiętajmy, aby koniecznie zainstalować oprogramowanie ActiveSync zanim podłączymy palmtopa do naszego PC. Wszystkie niezbędne adresy stron internetowych, z których za darmo można ściągnąć potrzebne nam oprogramowanie, znajdują się na końcu tego artykułu.

    Zaczynamy. Uruchamiamy Visual Studio .NET 2003. Z menu file wybieramy kolejno: File > New > Project > Visual C# Project > Smart Device Application. W polu „name” wpisujemy WynikiEgzaminu i klikamy OK. Teraz zostaniemy poproszeni o wybranie urządzenia na które chcemy pisać naszą aplikacje. Mamy do wyboru kilka możliwości Pocket PC, Windows CE, Smartphone. Zaznaczamy Pocket PC. W polu niżej możemy jeszcze wybrać rodzaj tworzonej aplikacji Aplikacja Windows, Klasa, Aplikacja bez graficznego interfejsu, Pusty Projekt. Wybieramy Aplikacje Windows (Windows Application) i klikamy OK. VS .NET stworzy dla nas nowy projekt.

    Teraz zajmiemy się projektowaniem interfejsu graficznego naszej aplikacji. Stworzenie atrakcyjnego i funkcjonalnego interfejsu programu wcale nie jest taką prostą sprawą. Urządzenia tylu Pocket PC, w przeciwieństwie do „zwykłych” komputerów, mają bardzo ograniczone możliwości wyświetlania. Zazwyczaj ich rozdzielczość nie przekracza 240 na 320 pikseli. Na stronie firmy Microsoft dostępne są specjalne materiały szkoleniowe dotyczące tworzenia interfejsu programów na urządzenia typu Pocket PC. W tym miejscu pragnę zaznaczyć, że nie jestem ekspertem w dziedzinie projektowania graficznej części aplikacji, pozostawiam tym samym pole do popisu szanownemu czytelnikowi. Nasza aplikacja wyglądać będzie tak jak jest to przedstawione na rysunku 1. Rysunek numer 2 przedstawia działającą aplikację na iPAQ’u model 2210.

    Rysunek 1.

    Rysunek 2.

    Na część graficzną naszej aplikacji składają się kontrolki typu: TextBox, Button, ListView. W tabeli poniżej znajduje się dokładny opis każdej z nich.

    Nazwa kontrolki

    Typ kontrolki

    Funkcja kontrolki

    txbIndeks

    TextBox

    Miejsce na wpisanie indeksu studenta.

    txbKolo1

    TextBox

    Miejsce na wpisanie ilości punktów za 1 kolokwium.

    txbKolo2

    TextBox

    Miejsce na wpisanie ilości punktów za 2 kolokwium.

    btnDodaj

    Button

    Kliknięcie w ten guzik powoduje dodanie studenta o indeksie z txbIndeks i punktach z txbKolo1 ,2  do bazy.

    btnUsun

    Button

    Kliknięcie w ten guzik powoduje usunięcie studenta o indeksie z txbIndeks z  bazy.

    btnEdytuj

    Button

    Kliknięcie w ten guzik powoduje zmianę danych studenta o indeksie z txbIndeks i punktach z txbKolo1 i txbKolo2 w  bazie.

    btnWyswietl

    Button

    Kliknięcie w ten guzik powoduje wyświetlenie pełnej zawartość bazy danych.

    lsvWyniki

    ListView

    Tutaj wyświetlane są wyniki studentów którzy znajdują się aktualnie w naszej bazie.

     

    Skoro interfejs graficzny jest już gotowy, możemy teraz przejść do właściwego programowania naszej aplikacji. Jako pierwszy musimy rozwiązać problem dodania SQL CE Serwera do naszego programu. Okazuje się, że zadanie to możemy zrealizować w bardzo prosty sposób. Dodajemy referencję do przestrzeni nazw System.Data.SqlServerCe klikając kolejno w VS .NET 2003: Project > Add reference… > (zaznaczamy) System.Data.SqlCerverCe > (klikamy) Select > (klikamy) OK. Teraz VS .NET 2003 podczas pierwszego uruchomienia automatycznie zainstaluje Microsoft SQL Server 2000 Windows CE Edition na naszym Pocket PC. Oczywiście przestrzeń nazw System.Data.SqlServerCe będzie widoczna jeśli wcześniej zainstalujemy pakiet SQL Server CE na naszym komputerze. Razem z serwerem zostanie zainstalowany program SQLCE Query Analyze (Rysunek 3).

    Rysunek 3.

    Program ten sluży do testowania poprawności komend SQL w środowisku SQL Serwer CE. Jest on bardzo pomocny przy tworzeniu zapytań języka SQL do bazy danych.

    Tworzenie bazy danych realizuje poniższy kod:

    System.Data.SqlServerCe.SqlCeEngine SQLEngine;
    SQLEngine=new SqlCeEngine("DataSource=\\MyDocuments\\WynikiEgzaminow.sdf");
    SQLEngine.CreateDatabase();     

    Domyślnie pliki bazy danych SQL CE Serwera mają rozszerzenie .sdf .

    Pole DataSource w kodzie wyżej to nic innego jak wskazanie pliku z bazą danych. System plików w Pocket PC jest zorganizowany bardzo podobnie do systemu plików UNIX’a. Katalogiem nadrzędnym jest „\” – folder ten nazywa się w angielskiej wersji systemu „My Device”. W gotowym programie WynikiEgzaminu dodatkowo sprawdzane jest czy plik z bazą danych już istnieje.

    if ( !(System.IO.File.Exists("\\My Documents\\WynikiEgzaminow.sdf")))
    {
    //     Tworzy bazę danych jeśli ta nie istnieje.
    }

    Aby połączyć się z wybraną przez nas bazą danych tworzymy instancję połączenia. Jako jego parametr DataSource przekazujemy lokalizację i nazwę wybranej przez nas bazy danych.

    System.Data.SqlServerCe.SqlCeConnection polaczenie;
    polaczenie = new SqlCeConnection("Data Source = \\My Documents\\WynikiEgzaminow.sdf");

    Otwieranie i zamykanie połączenia z bazą danych realizuje kod poniżej.

    polaczenie.Open();     //     Połącz.
    polaczenie.Close();     //     Rozłącz.

    Stan połączenia możemy łatwo określić przez metodę State. Informację na temat stanu połączenia możemy wykorzystać przy obsłudze błędów. Jeśli po otwarciu połączenia z bazą danych nastąpi jakiś błąd, który zostanie przechwycony przez blok catch() nasza aplikacja powinna rozłączyć połączenie. Tego typu działanie prezentuje poniższy kod.

    catch(Exception)
    {               
         if (polaczenie.State != ConnectionState.Closed)
         {
              polaczenie.Close();
         }
    }

    Jeśli w danej metodzie, w której wystąpił wyjątek implementowaliśmy parametry (o tym za chwile) lub obiekt DataReader powinniśmy pamiętać o wykasowaniu tego wszystkiego w bloku catch().

    Skoro potrafimy już tworzyć bazę i łączyć się z serwerem to kolejnym zadaniem jest zapytanie języka SQL do tego serwera. Jesteśmy na etapie kiedy bazę danych mamy już utworzoną lecz pozostaje ona wciąż pusta. Kolejne zapytania pokażą nam jak tworzyć tabele przy użyciu kwerend języka SQL. Samo zapytanie SQL’owe które tworzy tabele „Oceny” wygląda następująco (możemy je przetestować w programie SQLCE Query Analyze). Progam ten zostanie automatycznie zainstalowany podczas pierwszej kompilacji programu bądź to na emulatorze lub na fizycznym urządzeniu, na którym będziemy przeprowadzali kompilacje.

    CREATE TABLE Oceny
    (
         indeks     INT               NOT NULL,     PRIMARY KEY,
         kolo1          FLOAT     DEFAULT 0,
         kolo2          FLOAT     DEFAULT 0
    )

    Poniżej przedstawione są podstawowe (dodawanie, usuwanie, edycja) zapytania SQL, które będziemy wykorzystywali w programie.

    //     Dodawanie danych do tabeli Oceny.
    INSERT INTO Oceny (indeks, kolo1, kolo2)
    VALUES (123243, 10.5, 12.5)               
    //     Kasowanie wiersza z tabeli. (Usuwany jest student o indeksie 1234)
    DELETE FROM Oceny
    WHERE indeks = 1234
    //     Edycja danych z tabeli (Edytowane są dane studenta o numerze indeksu
    //     123. Nowe wartości pól kolo1 i kolo2 to kolejno 1 i 2.
    UPDATE Oceny
    SET kolo1 = 1, kolo2 = 2
    WHERE indeks = 123

    Powyżej przedstawiłem zapytania SQL modyfikujące dane. Aby aplikacja działała prawidłowo brakuje nam jeszcze jednego zapytania. Zapytanie którego jeszcze nie mamy realizuje wyświetlanie wszystkich studentów wpisanych do naszej bazy. Zapytanie to przedstawione jest poniżej.

    SELECT indeks, kolo1, kolo2
    FROM Oceny

    Zapytania SQL którymi się teraz zajmowaliśmy będziemy wykorzystywali w naszym programie. Komendy te będą częścią kodu w języku C#, które zaraz napiszemy. Kod przedstawiony poniżej możemy wykorzystać do dodawania, usuwania i edycji wierszy w bazie danych. Sposób działania kodu zależy oczywiście od tego co wpiszemy do zmiennej SQL.

    string SQL = "tresc kwerendy SQL";     //     INSERT, DELETE, UPDATE
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);
    zapytanieSQL.CommandType = CommandType.Text;
    zapytanieSQL.ExecuteNonQuery();     //     Właściwe wykonanie zapytania.

    Aby móc przeczytać zawartość bazy danych potrzebny nam będzie obiekt DataReader. Obiekt ten umożliwia nam przejście kolejno przez każdy wiersz naszej bazy. DataReader jest tylko do odczytu i nie możemy ingerować w jego zawartość.

    string SQL = "tresc kwerendy SQL";
    System.Data.SqlServerCe.SqlCeDataReader dr = null;
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);               
    dr = zapytanieSQL.ExecuteReader();
    lsvWyniki.Items.Clear();     //     Wyczyszczenie zawartości lsvWyniki     
    ListViewItem lsi = null;     //     Stworzenie obiektu ListViewItem
    while (dr.Read())               //     Dopóki jest co czytać to czytamy.
    {
         lsi = new ListViewItem();
         lsi.Text = dr["wartosc1"].ToString();
                             
         lsi.SubItems.Add(dr["wartosc2"].ToString());
    //     Wstawianie sformatowanego wiersza do lsvWyniki.
         lsvWyniki.Items.Add(lsi);     
    }
    dr.Close();     //     Zamykanie DataReader

    Podczas korzystania z obiektu DataReader pamiętajmy aby zamknąć obiekt (dr.Close();) przed zamknięciem połączenia z bazą.      

    Zapytania z parametrami i bez.

    Najlepiej będzie jak zobaczymy to na przykładzie.

    zapytanieSQL.CommandText = "INSERT INTO Oceny(indeks, kolo1, kolo2) VALUES (123456, 10, 15)";
    zapytanieSQL.ExecuteNonQuery();

    Polecenie języka SQL pokazane powyżej realizuje dodanie wiersza o wartościach

    indeks = 123456, kolo1 = 10, kolo2 = 15 do tabeli Oceny. To samo możemy jednak wykonać przy użyciu parametrów.

    //     Znaki zapytania to miejsca w które zostaną wstawione wartości
    //     poszczególnych prametrów.
    SQL = "INSERT INTO Oceny (indeks, kolo1, kolo2) VALUES (?, ?, ?)";
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);
    //     using System.Data.SqlServerCe; --> SqlDbType
    zapytanieSQL.Parameters.Add(new SqlCeParameter("indeks", SqlDbType.Int));
    zapytanieSQL.Parameters.Add(new SqlCeParameter("kolo1", SqlDbType.Float));
    zapytanieSQL.Parameters.Add(new SqlCeParameter("kolo2", SqlDbType.Float));
    zapytanieSQL.Prepare();               
    zapytanieSQL.Parameters["indeks"].Value = Convert.ToInt32(txbIndeks.Text.ToString());
    zapytanieSQL.Parameters["kolo1"].Value = Convert.ToDecimal(txbKolo1.Text.ToString());
    zapytanieSQL.Parameters["kolo2"].Value = Convert.ToDecimal(txbKolo2.Text.ToString());
    zapytanieSQL.ExecuteNonQuery();
    zapytanieSQL.Parameters.Clear();     //     Czyszczenie parametrów.

    Na pierwszy rzut oka może wydawać się to trochę dziwne. Po co realizować to samo polecenie pisząc 3 razy więcej kodu! Tego typu rozwiązania z parametrami stosuje się przy bardziej skomplikowanych i złożonych komendach SQL, aby w potem umożliwić szybką i sprawna analizę kodu.

    Właściwy kod aplikacji Wyniki Egzaminów.

    Nasza aplikacja posiada cztery podstawowe metody, są to kolejno Wyswietl(), Dodaj(), Usun(), Edytuj(). W tej części artykułu przyjrzymy im się nieco bliżej.

    Metoda Wyswietl().

    System.Data.SqlServerCe.SqlCeDataReader dr = null;
    polaczenie = new SqlCeConnection("Data Source = \\My Documents\\WynikiEgzaminow.sdf");
    polaczenie.Open();
    SQL = "SELECT * FROM Oceny";
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);               
    dr = zapytanieSQL.ExecuteReader();
    lsvWyniki.Items.Clear();               
    ListViewItem lsi = null;
    while (dr.Read())
    {
         lsi = new ListViewItem();
         lsi.Text = dr["indeks"].ToString();
                             
         lsi.SubItems.Add(dr["kolo1"].ToString());
         lsi.SubItems.Add(dr["kolo2"].ToString());
         lsvWyniki.Items.Add(lsi);
    }
    dr.Close();
    polaczenie.Close();

    Metoda Dodaj(). Realizuje zapytanie języka SQL (z parametrami).

    polaczenie = new SqlCeConnection("Data Source = \\My Documents\\WynikiEgzaminow.sdf");
    polaczenie.Open();
    SQL = "INSERT INTO Oceny (indeks, kolo1, kolo2) VALUES (?, ?, ?)";
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);
    zapytanieSQL.Parameters.Add(new SqlCeParameter("indeks", SqlDbType.Int));
    zapytanieSQL.Parameters.Add(new SqlCeParameter("kolo1", SqlDbType.Float));
    zapytanieSQL.Parameters.Add(new SqlCeParameter("kolo2", SqlDbType.Float));
    zapytanieSQL.Prepare();               
    zapytanieSQL.Parameters["indeks"].Value = Convert.ToInt32(txbIndeks.Text.ToString());
         if (txbKolo1.Text.Length == 0)
         {
              zapytanieSQL.Parameters["kolo1"].Value = 0;
         }
         else
         {
              zapytanieSQL.Parameters["kolo1"].Value = Convert.ToDecimal(txbKolo1.Text.ToString());
         }
         if (txbKolo2.Text.Length == 0)
         {
              zapytanieSQL.Parameters["kolo2"].Value = 0;
         }
         else
         {
              zapytanieSQL.Parameters["kolo2"].Value = Convert.ToDecimal(txbKolo2.Text.ToString());
         }
    zapytanieSQL.ExecuteNonQuery();
    zapytanieSQL.Parameters.Clear();
    polaczenie.Close();

    Metoda Usun().

    polaczenie = new SqlCeConnection("Data Source = \\My Documents\\WynikiEgzaminow.sdf");
    polaczenie.Open();
    SQL = string.Format("DELETE FROM Oceny WHERE indeks = {0}", txbIndeks.Text.ToString());
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);
    zapytanieSQL.ExecuteNonQuery();
    polaczenie.Close();

    Metoda Edytuj().

    string indeks = txbIndeks.Text.ToString();
    string kolo1 = Convert.ToString(0);
    string kolo2 = txbKolo2.Text.ToString();
    polaczenie = new SqlCeConnection("Data Source = \\My Documents\\WynikiEgzaminow.sdf");
    polaczenie.Open();
    string s = string.Format("UPDATE Oceny SET kolo1 = {0}, kolo2 = {1} WHERE indeks = {2}", kolo1, kolo2, indeks);                         
    zapytanieSQL = new SqlCeCommand(s, polaczenie);
    zapytanieSQL.ExecuteNonQuery();
    polaczenie.Close();

    Dodatkowo ciekawą metodą jest FormatujLsvWyniki(). Metoda ta formatuje komponent ListView tak aby wyglądał jak na rysunku 1. Jako parametry do metody Add() przekazywane są kolejno: nazwa wyświetlana w kolumnie, szerokość kolumny i wyrównanie tekstu.

    lsvWyniki.View = View.Details;
    lsvWyniki.Columns.Add("Indeks", 60, HorizontalAlignment.Left);
    lsvWyniki.Columns.Add("Kolo 1", 49, HorizontalAlignment.Left);
    lsvWyniki.Columns.Add("Kolo 2", 49, HorizontalAlignment.Left);

    Ważną częścią, której nie zamieściłem w kodzie w artykule jest obsługa błędów. Tego typu kod zabierał by byt wiele miejsca w artykule i powodował by utrudnioną analizę programu. W tym miejscu zachęcam do przeglądnięcia kodów źródłowych w których obsługa błędów została zaimplementowana. Link do kodu programu powinien znajdować się na samym dole tej pracy.

    Poniżej zamieszczono najczęściej spotykane operacje, które przeprowadzamy na bazach danych.

    Aby stworzyć bazę danych.

    System.Data.SqlServerCe.SqlCeEngine SQLEngine;
    SQLEngine=new SqlCeEngine("DataSource=\\plik_bazy.sdf");
    SQLEngine.CreateDatabase();

    Aby sprawdzić czy połączenie z bazą jest zamknięte.

    if (polaczenie.State != ConnectionState.Closed)
    {
         polaczenie.Close();
    }

    Aby połączyć (rozłączyć) się z bazą danych.

    System.Data.SqlServerCe.SqlCeConnection polaczenie;
    polaczenie = new SqlCeConnection("Data Source = \\baza.sdf");
    polaczenie.Open();     //     Połącz.
    polaczenie.Close();     //     Rozłącz.

    Aby zadać zapytanie do bazy danych.

    string SQL = "tresc kwerendy SQL";     
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);
    zapytanieSQL.CommandType = CommandType.Text;
    zapytanieSQL.ExecuteNonQuery();     

    Aby przeczytać zawartość bazy danych. Wynik zapisany do DataReader.

    string SQL = "tresc kwerendy SQL";
    System.Data.SqlServerCe.SqlCeDataReader dr = null;
    zapytanieSQL = new SqlCeCommand(SQL, polaczenie);     
    dr = zapytanieSQL.ExecuteReader();

    Niezbędne programy do ściągnięcia ze strony www firmy Microsoft.

    SDK for Windows Mobile 2003-based Pocket PCs

    http://www.microsoft.com/downloads/details.aspx?FamilyId=9996B314-0364-4623-9EDE-0B5FBB133652&displaylang=en

    SQL Server CE Version 2.0

    http://www.microsoft.com/sql/ce/downloads/ce20.asp

    ActiveSync 3.7.1

    http://www.microsoft.com/windowsmobile/resources/downloads/pocketpc/activesync37.mspx

    Tomek Popów

    Autor artykułu jest studentem Politechniki Wrocławskiej, kierunek Informatyka Matematyczna. Wszelkie pytania i cenne uwagi proszę kierować na mój adres poczty elektronicznej: popek007@poczta.onet.pl .

    Załączniki:

    tagi: SQL

    Komentarze 9

    aldona_b6614
    aldona_b6614
    0 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Artykuł ciekawy i poparty praktycznym przykładem. Podobało mi się i czekam z niecierpliwością na 2 część na temat synchronizacji danych PocketPC - PC.
    rasneo
    rasneo
    0 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Rewelacyjny... a przede wszystkim sensowne przyklady. Czekam na kolejne artykuły!
    batonik
    batonik
    0 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Nie tak dawno temu był już artykuł o SQL Server CE, ale ten tutaj prezentuje garść użytecznych informacji, których zdaje się w tamtym trochę brakowało. Temat ciekawy i na czasie, do którego "przymierzę się" w jakiejś wolnej chwili ;).
    komar6667497
    komar6667497
    0 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Artykul jest interesujacy i poparty przykladami - kazda osoba jest wstanie ogarnac przedstawiony material i wykorzystac go do wlasnych potrzeb :>
    zbroszki
    zbroszki
    0 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Tandetka
    pkirylcz1843
    pkirylcz1843
    0 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Trafność tematu w dyche.
    User 79899
    User 79899
    35 pkt.
    Poczatkujacy
    21-01-2010
    oceń pozytywnie 0
    W porzadku, ale przydaloby sie zintegrowanie jeszcze ze ze zwyklym SQL Serverem, bo tak to duzo juz bylo we wczesniejszym artykule. Poza tym podobalo sie przeprowadzenie testu na urzadzeniu a nie symulatorze:).
    Dąbek
    Dąbek
    5 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Może i temat ok, ale: 1. Czy Ty pisałeś już kiedyś jakiekolwiek programy, bo wieje mi tu ostro amatorką. Całkowity brak obsługi błędów w niektórych funkcjach, a w pozostałych niezbyt przemyślany 2. pobieranie danych z bazy nie jest odporne na jej zmianę. Podstawowa sprawa - nie robi się zapytań w stylu "SELECT * FROM costam" 3. to co robi funkcja FormatujLsvWyniki() równie dobrze można ustawić w środowisku przez co kod źródłowy stanie się bardziej przejzysty. 4. Niejednolity styl pisania kodu - raz używasz parametrów, raz łączysz stringi. Do tego drugi sposób używasz w miejscach najbardziej podatnych na błędy (chodzi mi o zapisywanie decimali do bazy). Zdecyduj się w końcu na coś i pamiętaj o konsekwencjach tego wyboru. 5. czy słyszałeś kiedykolwiek o bloku finally używanym wraz z try-catch? Jak nie to doczytaj, bo tu się przydaje 6. Błędy w wykonywaniu zapytań zwracane są przez SqlCeException a nie przez Exception czego nie uwzględniłeś w obsłudze błędów 7. wiele, wiele innych
    jedrekwie
    jedrekwie
    5 pkt.
    Nowicjusz
    21-01-2010
    oceń pozytywnie 0
    Artykul malo ciekawy-szczegolnie w kontekscie tego,ktory pojawil sie na Codeguru nieco wczesniej.Ciagle nie moge sie doczekac ciekwaszego wykorzystania SQL Server CE - jak dotad nikt nie wspomnial o mozliwosciach replikacji migawkowej i RDA z uzyciem tego serwera bazodanowego, a tak na prawde dopiero te mozliwosci decyduja o przydatnosci i sile SQL Server CE.
    pkt.

    Zaloguj się lub Zarejestruj się aby wykonać tę czynność.