Tema: Re: .Net projekto architektura
Autorius: Jornada Del Muerto
Data: 2010-10-08 15:28:28
    Abi sios duomenu bazes turi ADO.NET palaikyma ant .NET CF, SQLite aplamai daug ivairiu connectivity budu palaiko: http://www.sqlite.org/cvstrac/wiki?p=SqliteWrappers ten susirask .net framework, tau rodos sito reikes: http://sourceforge.net/projects/sqlite-dotnet2/files/ bet dar pasiziurek nes man to reikejo pries pora meteliu tai tik is atminties pasirinkau kazkuri, galejau klyst.


    Zodziu gausi namespace: System.Data.SQLite kaip ir System.Data.SqlClient rodos del MSSQL kazka irgi reiks papildomai i PDA installint, bet is .NET CF paketo, o toliau elementarus SQL.


using System.Data.Common; // del interface'u 
using System.Data.SqlClient; // mssql
using System.Data.SqLite; // SQLite
...
...

IDBConnection srcCn, destCn;
IDBTransaction srcTran, destTran;

    try {
        srcCn = new [System.Data.]SqLiteConnection(..parametrai..);
        destCn = new [System.Data.]SqlConnection(..parametrai..);

        srcTran = srcCn.BeginTransaction();
        destTran = destCn.BeginTransaction();

        /**
           * Viskas kas cia vyks ivykus bet kokiai klaidai bus rollbackinama, abiejuose db
           * Ta prasme duomenu apsikeitimo sesija neperduos puse duomenu o tik visus
           */

        // Viska baigem gerai
        srcTran.Commit();
        destTran.Commit();
    } 
    catch (Exception ex) {
        // Erroras
        MessageBox.Show(ex.Message +"\r\n\"+ex.StackTrace, "Duomenų apskeitimas nutrauktas!");

        srcTran.Rollback();
        destTran.Rollback();
    }
    finally {
        srcCn.Close();
        destCn.Close();
    }


O toliau dirbi paprasciausiu SQL su abiejom db, zinant lentu struktura galima net funkcijas pasirasyti, pas mane buvo net universali funkcija tam, pvz

     void CopyTable ( 
        IDBConnection srcCn, 
        IDBConnection destCn,
        string srcTable,
        string destTable);

        Tai lengvai gaunasi jei absoliuciai visus duomenis keli, pagal mano kuriamos sistemos biznio logika susijungimo su PC metu turedavo buti iskraunami visi i PDA ivesti duomenys is PDA ir atnaujinami PDA zodynai, reiskias is PDA viska kopijuodavau BULK visus duomenis, po to visus duomenis istrindavau ir paimdavau nauja zodynu informacija ir viskas.


    void WipeTable (IDBConnection cn, string table) {
        if(cn.State == ConnectionState.Open ){

            ir valai viska "DELETE FROM "+table
        }
        else {
            throw new Exception("Connection was disconnected trying to wipe table: "+table);
        }
    }

Siaip tai tokiam transfer'iui kai rasydamas si straipsni pagalvojau galima butu transportavimo klase pasirasyti, pvz:


class DataTransport { 

    bool error = false;
    IDbTransaction srcTran, destTran;
    IDBConnection srcCn, destCn;

    public DataTransport(IDBConnection source, IDBConnection destination) {
        srcTran = destTran = null;

        srcCn = source;
        destCn = destination;
    }

    void Start () {
    
        if(srcTran!=null || destTran!=null ){
            throw new Exception("Transaction in progress!");
        }

        srcTran = srcCn.BeginTransaction().....

        ir t.t..

        error = false;

    }

    void End (){
        if(error) {
            if (srcTran!=null) 
                srcTran.Rollback()...
                ... taspats su dest
        }
        else {
            ...commit
    }

    void BulkCopyTable (string source, string destination ){
            DataTable srcTable = db.Query("Select * from source");

            string fieldNames = string.Empty;

            foreach(DataColumn col in srcTable.Columns) {
                fieldNames += (string.IsNullOrEmpty(fieldNames) ?  col.Name : ","+col.Name;
            }    

            foreach(DataRow row in srcTable.Rows ) {
                string sql = "Insert Into "+destination+" ("+fieldNames+") values (";

                foreach(.. row.ItemArray...
            }
          Beja niekas nedraudzia konkrecias uzklausas ne table names padavineti, pvz gal db skirsis pavadinimai ir panasiai  
    }    

}

Zodziu tiesiog SQL kopijuoji, viska rasiau is galvos tai cia tik ideja pati ;)

P.S. 
    As visada su ADO.NET naudoju supaprastinta klase wrapperi, cia apie ja mano straipsniukas: http://www.lythum.lt/adonet-programavimas-naudojant-interfeisus

    Tiesa cia rasyta ir is galvos be testavimo, nors turiu ir kuri veikia, bet taip butu neydomu jei viska ant lekstutes padetu ane? ;)

    vidumoje tai supaprastina sql iki:

    Sql db = new Sql(new SqlConnection|OdbcConnection|SqliteConnection|OracleConnection ir tt...  ta prasme dirba klase interfeisu lygmenyje jai nesvarbu koks tiksliai connectionas, connection striga ir visa kita inicializuoji pries jai paduodant)

    DataTable t = db.Query("Select kazkas from kazkur");

    db.Execute ("Update Kazkaz Kazkur..)\

    Ir viskas...










"M" <nesvarbu@nera.lt> wrote in message news:i8n05e$osa$1@trimpas.omnitel.net...
> Gal gali placiau kaip tu SQL litle sinhronizuoji su pagrindine sql baze ?
> 
> "Jornada Del Muerto" <agiraTrintI@gmx.co.uk> wrote in message 
> news:i8hha8$1o4$1@trimpas.omnitel.net...
>>    Teke su tokiom technologijom dirbti, daugiausiai su sandelio sistemom, 
>> klientas pageidaudavo prekiu saraso su gan daug ivairios informacijos apie 
>> preke, neskaitant ivairios uzsakymu ir didelio kiekio klientu 
>> informacijos, tai MSSQL CE (tavo vadinamu SQL Compact) nevezdavo tada 
>> daugiau kaip 1500 prekiu irasu (bent ant tu pda) ir labai daug vietos 
>> uzimdavo tas jo failas palyginus su SQLite.
>>
>>    Veliau perdariau visa ju programeles varikli ant SQLite, tai laisvai 
>> dirbdavo su 20 tukstanciu prekiu irasu islaikant tapacia db struktura ir 
>> is bedos net su 100 000 nors tiesa letai, duomenys su SQLite lyginant su 
>> MSSQL CE laikomi kokia 10 kartu kompaktiskiau net Unicode rezime.
>>
>>    Si Micsosoft technologija siuloma PDA yra visiskai ne nasi, nepatogi ir 
>> t.t.. ta prasme:
>>
>>     1. uzima daug vietos laikomi duomenys PDA
>>     2. su dideliais ju kiekiais PDA dirba letai.
>>     3. Nepatogu keisti kazkokia DB stuptura, tenka p*stis su 
>> MSSQLsinchronizacijom.
>>
>>    Nuo .NET 2005+ CF yra gerai atidirbta sio framework ADO.NET dalis ir 
>> bent jau su MSSQL galima dirbti beveik taip pat kaip ir is ne compact 
>> frameworko, ta prasme laisvai accessint MSSQL ir is tem imti ar i tenai 
>> deti duomenis, tai kazkoks duomenu apsikeitimas ne problema, o vietine 
>> saugykla laikas parode kad geriau tarnauja SQLite, labai paprasta DB, 
>> palaikanti net tranzakcijas, taip kad aisku tavo reikalas sprest ka 
>> naudoti.
>>
>>    p.s. Tiesa PDA kuo puikiausiai dirba su SOAP Webservice'ais tai esant 
>> pastoviam online variantui galima is viso be vietines PDA db dirbti.
>>
>> "a" <a@a.a> wrote in message news:i8fj0p$qqb$1@trimpas.omnitel.net...
>>> Hi,
>>>
>>> Mano pirma kiek didesne programele, noreciau pasitarti del bendros
>>> architekturos.
>>>
>>> WinForms ir Mobile 6.1 appsas.
>>> Vartotojas mobile appse pagrinde tik ivedineja duomenis. Duomenys nuseda
>>> device'o SQL Compact DB'azej, kuri veliau yra sinchronizuojama su 
>>> isoriniu
>>> pilnaverciu SQL 2008 serveriu.
>>> Desktopiniam appse vartotojas gali sinchronizuoti duomenis su isoriniu 
>>> SQL
>>> serveriu, taip pat vesti naujus, redaguoti, generuoti grafikus, 
>>> spausdinti
>>> ataskaitas, etc. Jei rysio nera - saugoja lokaliai, atsiradus -
>>> sinchronizuoja.
>>>
>>> Duomenu sinchronizavimo igyvendimui buvau nuziurejes "Local Database 
>>> Cache"
>>> atveji 
>>> (http://msdn.microsoft.com/en-us/library/cc714035%28VS.90%29.aspx).
>>> Dabar pradejus daryti susiduriau su beda, kad Compact versija nepalaiko
>>> "Stored Procedures" ir darosi sudetinga padaryti elementaru editable
>>> DataGridView su duomenim is keliu lenteliu pagal vartotojo kriterijus. 
>>> Tada
>>> gal WinForms pusej geriau SQL Express versija, bet tada sinchronizavimas 
>>> gal
>>> kiek ne standartiniais MS'o numatytais keliais gautusi..
>>>
>>> Aciu visiems uz bet kokius pastebejimus, ar gal skaitini kazkoki sitai
>>> temai..
>>> 
> 
>