31.10.07

LINQ - .NET Language Integrated Query I Dio

U nekoliko prethodnih postova pisao sam o novinama i proširenjim nove verzije C# 3.0. Proširenja koja su spomenuta omogućuju implementaciju LINQ (Language Integrated Query) kao nove tehnologije pristupa i manipulacije informacija u aplikaciji.

Izvorni kod za ovaj članak možete preuzeti ovdje.

Uvod

U Posljednjih 20 godina razvoj programskih jezika došao je do stadija kada posjedujemo moćne objektno orijentisane programske jezike poput C++, C#, JAVA, i sl. Programeri danas koriste sve blagodati OOP poput klasa, objekata, nasljeđivanja, polimorfizma i sl. Možemo kazati da je era OOP došla do svog vrhunca kada se počela razvijati tehnologija upravljanja i kontrole curenja memorije u programskim jezicima. U posljednjih nekoliko godina postavlja se pitanje šta dalje i u kom pravcu razvijati programske jezike, na način da pomažu programerima u razvijanju softvera.

Jedan pravac u kojem se ide, a koji je posljednjih nekoliko godina sve više zastupljen je razvijanje IDE alata za automatsko generiranje koda tzv. Rapid Application Developmen (RAD). Danas kad pogledamo software za razvoj aplikacija vidimo mnogo ugrađenih alata za generiranje raznih uglavnom ponavljajući sekvenci izvornog koda. Danas se aplikacije razvijaju na način da imate osjećaj kako radite u nekom od klasičnih softvera za crtanje: povlačite stavke iz kutija sa alatima, dijagramski pišete klase i dodajete metode, članove, nasljeđivate klase itd.

Sagledavajući današnju tehnologiju i pravac u kome se razvija buduća tehnologija svakako je smanjivanje kompleksnosti pristupa i integracije informacijama koja nije prirodno povezana se OPP. Naime gotovo svaka aplikacije manipuliše određenim podacima koji su po prirodi stvari odvojeni od same aplikacije. Podaci kojim manipulišemo dolaze uglavnom iz dva glavna izvora a to su relacijske baze podataka i XML.

Manipulacija sa podacima koji dolaze iz ova dva izvora programera više stvara svestranijim nego stručnijim, jer nužno stvara uslov poznavanja drugih tehnologija osima primarne tehnologije razvoja aplikacija u određenom programskom jeziku. LINQ projekat se bazira na problemima manipulacije podataka opisanih prethodno.

LINQ kako i sam naziv govori je sastavni dio primarnog programskog jezika, koji sa sastoji od standardnih operatora upita za manipulaciju, projekciju, filtriranje sa podacima na način sličan kako se to radi pomoću SQL. Izvor podataka nad kojim se vrše upiti ne ograničava se samo na eksterne izvore podataka, nego na generalno svaki izvor podataka kako eksterni tako i interni – aplikacijski izvor podataka. Ovo omogućuje da programer ostaje u svom primarnom programskom jeziku dok manipuliše podacima iz izvora podataka.

Aplikacija standardnih operatora upita mogu se primjeniti na svaki izvor podataka koji je izveden iz IEnumerable<T>
interfejsa. Ovo omogućava da se razvijaju komponente trećih strana koje podržavaju LINQ, i koje mogu zamjeniti standardne operatore sa svojom vlastitom implementacijom, a samim tim se stvara široka lepeza primjene LINQ.

Upoznavanje sa LINQ

Za početak pogledajmo jednostavan program koji koristi standardne operatore upita primjenjene na polje stringova.

Ako ovaj program pokrenemo kao rezultat ćemo dobiti sve gradove koji se sastoje od 5 slova.

Kao što smo naglasili svaki tip koji je izveden iz IEnumerable<T> interfejsa podržava LINQ operatore. U našem primjeru koristili smo 3 standardna operatora upita: select, where, orderby. Isti primjer možemo napisati bez dotičnih operatora na sljedeći način:

Argumenti koji se pojavljuju u metodama standardnih upita zovem lambda izrazi , oni obezbjeđuju da se standardni operatori upita definišu posebno kao metode i spajaju lančano korištenjem tačka notacije.

U prethodnom primjeru značajno je kazati da se evaluacija upita ne dešava u trenutku njegovog deklarisanja. Evaluacija upita se dešava u onom trenutku kada pristupamo varijabli odnosno u našem primjeru evaluacija upita vrši se u bloku koji je označen naredbom foreach. Ovakva odgođena evaluacija upita upit čini fleksibilnim i dozvoljava izvršavanje više puta. Pretpostavimo sljedeći primjer:

Ako pokrenemo aplikaciju rezultat dobijamo:

Upit se evaluira svaki put kada smo iterirali varijablu izraz.

29.8.07

Ultimate Toolbox, Grid i TCP/IP u open source verziji

Jedna od najpoznatijih kompanija koja razvija komponente bazirane na MFC C++ u posljednjih 15 godina bila je zasigurno Dundas Software's. Njihovi proizvodi imali su prefiks Ultimate (UltimateGrid, UltimateToolbox, UltimateTCP/IP). U januaru 2005 godine David Cunningham and Chris Maunder (osnivač Code Project zajednice) osnivaju firmu TheUltimateToolbox.com, te izdvajaju iz Dundas Software's Ultimate proizvode. U prethodnih nekoliko dana na Code Project zajednici objavljen je niz članaka u kojima se ove komponente nakon više od 10 godina otvaraju u Open Source verziji. Ove komponente mogu skinuti članovi Code Project zajednice jedne od najvećih zajednica koje razmjenjuju informacije o microsoftovim tehnlogijama C++,MFC, ATL, VB, C#, VB .NET, ASP itd. Više informacije o ovim komponentama možete dobiti ovdje. Naravo morate se učlaniti da bi skinuli cijeli source code.

O CodeProject.com


Ova zajednica broji preko 4,5 miliona članova, u svakom trenutku je preko 15000 članova online. Mogu se pohaviti da sam jedan od prvih članova ove zajednice (657 član od 6. Jula. 2000). Ako se želite baviti programiranjem na nekoj od microsoftovih tehnologija vaš izvor informacija na kojoj možete naći skoro sve što vas zanima je upravo www.codeproject.com.

Entity Framework beta 2 i 1st Entity Framework Tool CTP Released

U ponedjeljak 27. 08.2007 godine ADO .NET team blog je konačno objavio izlazak Entity Framework beta 2 i prvi CTP za Entity Framework Tools. U narednim postovima biće više riječi o ovoj microsoftovoj tehnologiji. Link sa kojeg možete skinuti EF beta 2 i EFT 1 st CTP.

Više informacija možete dobiti na ADO .NET Team Blog

24.8.07

ADODB Data Link - povezivanje sa bazom podataka



Slika 1 Data Link u akciji

Data Link dijalog je COM objekt pomoću kojeg na jednostavan način definišemo konekciju sa određenim provajderom baze podataka. Nakon podešavanja provajdera potrebno je podesiti server ili putanju do baze podataka (u zavisnosti od provajdera) za validan string konekcije.

U ovom primjeru biti će prezentirana jednostavna demo aplikacija koja poziva Data Link dijalog uzima string za konekciju sa bazom podatka, te pohranjuje isti u user.config datoteku koja obezbjeđuje stalnost stringa za korištenje.

DATA LINK Demo

Data Link demo je jednostavna aplikacija koja se sastoji od jedne forme u kojoj preko dugmeta "DataLink" pozivamo Data Link dijalog podešavamo konekciju stringa te isti prikazujemo u edit kontroli. Zatim isti string pohranjujemo u config datoteku.

Na narednoj slici prikazana je demo aplikacija sa kontrolama za manipulaciju da data link dijalogam.

Slika 2 Data Link Demo aplikacija

Prilikom aktivacije klika na dugme DataLink izvršava se sljedeći dio koda za upravljanje sa događajem button1_Click.

private void button1_Click(object sender, EventArgs e)
{
try

{


//Izlvacenje tipa šrograma pomocu refleksije
Type type = Type.GetTypeFromProgID("DataLinks");


//Formiranje instance dijaloskog okvira Data Link
object links = Activator.CreateInstance(type);

//Pojavljivanje dijaloga pomocu kojeg podesavamo konekciju
object str1 = type.InvokeMember("PromptNew", BindingFlags.InvokeMethod, null, links, null);


//data link posjeduje osobinu "Connectionstring" u koju pohranjuje konekciju stringa koju smo upravo podesili

object s = str1.GetType().InvokeMember("ConnectionString", BindingFlags.GetProperty, null, str1, new object[0]);

//Provjera da li je vracena varijabla ( "ConnectionString" ) validna

if (s != null)
{

//Vracena varijabla je tipa string sto mozemo lako konvertovati
string
strBuid = (string)s;

//Zapis konekcije string u Edit kontrolu
textBox1.Text = strBuid;

//Pohranjivanje stringa konekcije u user config datoteku
Properties.Settings.Default.Save();

}
}

catch(System.Exception ex)

{
MessageBox.Show(ex.Message);
return;
}
}

Pohranjivanje konekcije u config datoteku


Kada smo implementriali data link i string konekciju potrebno je isti pohraniti izvan memorije aplikacije da bi se uspješno mogao koristiti prilikom svakog startanja aplikacije.

U tom smislu potrebno je definisati varijablu u settings.settings kategoriji a zatim povezati sa textmom edit kontrole.

Na narednoj slici prikazan je način definisanja varijable u config datoteci.

Slika 3 Definisanje varijable u confg datoteci

Priliko definianja varijable potrebno je dfinisati naziv varijable, tip, te inicijalu vrijednost (Name,Type, Value respektivno). Kolona pod nazivom scope označava na kojem nivou se varijabla definiše. U ovom kontekstu postoje dva nivoa:

  1. User – definisanje varijable na novou korisnika, to znači ako postoji više korisničkih računa u Windows OS, svaki račun će definisati varijablu zasebno. Config datoteka se pohranjuje u [DISK]:\Documents and Settings\[Naziv računa]\Local Settings
  2. Application – definisanje varijable na novou aplikacije i svi windows računi će dijeliti istu vrijednost varijable.

Nakon definisanja varijable potrebno je istu povezati sa textom edit kontrole u glavnoj formi aplikacije. Naredna slika pokazje pridruživanje varijable edit kontroli.

Nakon pridruživanja potrebno je implementirati da se string kone

kcije iz edit kontrole zapiše u config datoteku. Ovo postižemo pozivom :

//Pohranjivanje stringa konekcije u user config datoteku

Properties.Settings.Default.Save();

Slika 4 Povezivanje teksta edit kontrole varijabli stringKonekcije

Kompletan primjer sa izvornim kodom možete skinuti ovdje.


22.8.07

C# 3.0 var keyword

U nekoliko prethodnih postova sam pisao o novinama koje dolaze izlaskom C# 3.0. Jedna od novina koje su pobudile veliko interesovanje programera je novi tip var . Opis novog tipa ću pokušati objasniti na primjerima i specifičnostima njegove upotrebe.

Npr. imamo sljedeći kod:

var intVNumber = 23;

var strVRijec = "Vozdra Svijete";

Ovo znači da tip var neka vrsta zajedničkog tipa, koji može sadržavati bilo koji type. Ovo može zvučati kao izmišljanje tople vode, jer sve to može raditi i object tip.

Npr:

object objNumber = 23;

object objRijec = "Vozdra Svijete";

Međutim pogledajmo sljedeći dio koda:

intVNumber ++; //Kompajler ne prijavljuje nikakvu grešku jer je var uistinu tipa int
intONumber++; //error CS0023: Operator '++' cannot be applied to operand of type 'object'

Ovo znači da nema govora o tome kako object može zamjeniti ovu riječ. Da bi se uvjerili u to pokušajmo kompajlirati sljedeći dio koda:

intVNumber = objNumber;//error CS0266: Cannot implicitly convert type 'object' to 'int'. An explicit conversion exists (are you missing a cast?)

Ali ovaj dio koda će se kompajlirati:

intVNumber = (int)objNumber;

Još jedna krucijalna stvar koja var tip razlikuje od tip object je nrp kada pokušamo kompajlirati sljedeći dio koda:

intVNumber=strVRiječ; // error CS0029: Cannot implicitly convert type 'string' to 'int'

Ovo znači da var u svojoj deklaraciji poprima jedan od tipova, koji se više ne može dinamički mjenjati tokom životnog vijeka ove varijable. Za razliku od var, object može poprimati različite tipove.

objNumber = objRijec;//Kompajler ne prijavljuje grešku

Pogledajmo sljedeći dio koda:

var objVarijabla=objNumber; //objVarijable je tipa object

Sada možemo pisati:

objVarijabla = "Vozdra Svijete";
objVarijabla = 123.456;
objVarijabla = 's';

U ovom slučaju var objVarijabla inicijalizirana je sa varijablom tipa object, što znači da objVarijabla sada ima sve osobine tipa object.

Osobine var tipa

Nekoliko limitirajući osobina ovaj tip čini specifičnim:

  • Kada deklarišemo var tip tada mora postojati i inicijalizacija istog npr:

    var xvarijabla; // Greška, ne postoji inicijalizacija koja bi ukazivala na određeni tip
    var xKolekcija = {1, 2, 3}; // Greška, inicijalizacija kolekcije nije dozvoljena
    var xNull = null; // Greška, null tip nije dozvoljen

  • var
    tip deklariše se samo kao lokalna varijabla, te ne može biti prosljeđena preko funkcije u bilo kojem obliku

    public
    int Increment(var intNumber)

    {
    return intNumber +=23;

    }

Kompajler će prijaviti grešku: error CS0825: The contextual keyword 'var' may only appear within a local variable declaration

Kao i u prethodnim zaključcima novine u C# 3.0 vežu se za LINQ Language integrated query, pa tako i tip var.