Documente Academic
Documente Profesional
Documente Cultură
NET
internal acces permis doar in clasa sau spatiul de nume in care e cuprinsa
- Vertraulich / Confidential -
accesibil oricarui membru al clasei care-l
protected contine si al claselor derivate
In lucrul cu multithreading-ul apare o problema majora, cea a sincronizarii: mai multe fire
de executii acceseaza acelasi obiect, simulan. Solutia vine de la “lock”: atunci cand
primul thread acceseaza obiectul, il va tine “ocupat” pana la incheiere.
Folosirea firelor de executie permite rularea proceselor simultan, dar acest lucru poate
incetini executia programului, daca nu sunt folosite cu atentie.
O aplicatie C# poate deveni multi-threading in doua moduri: fie explicit prin crearea si
rularea firelor de executie, fie prin folosirea unor caracteristici ale .Net care creeaza
implicit thread-uri: BackgroundWorker, thread pooling sau la construirea unui Web Service
sau unei aplicatii Asp.Net.
SqlDataReader
Tipul SqlDataReader este folosit pentru a citi date in cea mai eficienta metoda posibila.
NU poate fi folosit pentru scriere.
O data citita o informatie nu mai poate fi citita inca o data.
SqlDataReader citeste secvential date.
Datorita faptului ca citeste doar inainte (forward-only) permite acestui tip de date sa fie
foarte rapid in citire.
Overhead-ul asociat este foarte mic (overhead generat cu inspectarea rezultatului
si a scrierii in baza de date). Daca intr-o aplicatie este nevoie doar de informatii care vor
fi citite o singura data, sau rezultatul unei interogari este prea mare ca sa fie retinut in
memorie (caching) SqlDataReader este solutia cea mai buna.
- Vertraulich / Confidential -
SqlDataReader obtine datele intr-un stream secvential. Pentru a citi aceste informatii
trebuie apelata metoda Read; aceasta citeste un singur rand din tabelul rezultat. Metoda
clasica de a citi informatia dintr-un SqlDataReader este de a itera intr-o bucla while asa
cum se vede in figura 4
la liniile 32-35.
Metoda Read intoarce true cat timp mai este ceva de citit din stream.
SqlDataReader implementeaza si indexatori (am obtinut prima coloana in exemplul din
figura 4
folosind indexatori numerici). In exemplul din figura 4 nu este foarte clar pentru cineva
care
citeste codul ca acolo este vorba de coloana CustomerID (decat daca s-a uitat si in baza
de date).
Din aceasta cauza este preferata utilizarea indexatorilor de tipul string. In acest caz codul
devine:
SqlDataAdapter
Pana acum am vazut cum putem efectua operatii asupra unei baze de date folosind
obiecte de tipul SqlCommand si SqlDataReader. Problema cu aceasta abordare este ca pe
parcursul intregii tranzactii conexiunea trebuie sa fie deschisa.
Voi prezenta in continuare o metoda care nu necesita o conexiune permanenta la o baza
de date - si anume folosind obiecte de tipul DataSet si SqlDataAdapter.
Un DataSet este o reprezentare in memorie a unui data store (un sistem de stocare si
obtinere a datelor). Un DataSet contine o multime de tabele asupra carora se pot executa
diverse operatii.
Un DataSet doar retine informatii si nu interactioneaza cu un data source.
SqlDataAdapter este cel care se ocupa administrarea conexiunilor cu data source si ofera
comportamentul de lucru in mod deconectat. SqlDataAdapter deschide o conexiune doar
atunci cand este nevoie si o inchide imediat ce si-a terminmat treaba. De exemplu
SqlDataAdapter realizeaza urmatoarele
operatiuni atunci cand trebuie sa populeze un DataSet:
1. deschide conexiunea;
2. populeaza DataSet-ul;
3. inchide conexiunea;
- Vertraulich / Confidential -
Intre aceste operatii in DataSet se poate scrie sau citi. Acestea sunt mecanismele de a
lucra in mod deconectat. Pentru ca aplicatia tine deschisa conexiunea la baza de date
doar atunci cand este necesar, devine mai scalabila.
Codul de mai sus nu reflecta puterea firelor de executie multiple, pentru ca avem doar
unul. O sa adaugam inca un thread, o sa setam numele pentru o identificare mai usoara
si vom folosi proprietatea CurrentThread care va returna firul de executie curent.
//obiectul Thread
Thread thread1 = new Thread (new ThreadStart(numara.Zece));
Thread thread2 = new Thread(new ThreadStart(numara.Zece));
thread1.Start();
thread2.Start();
5. Ce reprezinta remoting?
C# Remoting Architecture
- Vertraulich / Confidential -
computer , different computers on the same network, or on computers across separate
networks. The .NET Remoting supports distributed object communications over the TCP
and HTTP channels by using Binary or SOAP formatters of the data stream.
1. C# Remotable Object
6. Ce reprezinta un WebService?
Un serviciu Web (Web Service) este o aplicatie Web de tip client-server, în care un server
furnizor de servicii (numit si "Service Endpoint") este accesibil unor aplicatii client (care
nu sunt de tip browser) pe baza adresei URL a serviciului. Serviciul Web si clientii sãi pot
rula pe platforme diferite si pot fi scrise în limbaje diferite,deoarece se comunicã prin
protocoale standard HTTP, XML, SOAP, JSON, s.a. De aceea principalul merit al serviciilor
Web este acela cã asigurã interoperabilitatea unor aplicatii software implementate pe
platforme diferite si cu instrumente (“framework”-uri) diferite. In acelasi timp aplicatiile
sunt slab cuplate (“loosely coupled”), în sensul cã mesajele schimbate sunt standard
(“self-contained”) si oricare dintre aplicatii nu presupune existenta la celãlalt capãt a
altor facilitãti decât cele continute în standarde.
Din punct de vedere al tehnologiilor folosite existã douã tipuri de servicii Web:
- Servicii de tip REST ( RESTful Web Services), în care cererile de la client se exprimã
prin comenzi HTTP (GET, PUT, POST,DELETE), iar rãspunsurile sunt primite ca documente
XML sau JSON;
- Servicii de tip SOAP (Simple Object Access Protocol), în care cererile si rãspunsurile au
forma unor mesaje SOAP (documente XML cu un anumit format) transmise tot peste
HTTP. In astfel de servicii furnizorul expune si o descriere a interfetei API sub forma unui
document WSDL (Web Service Description Language), care este tot XML si poate fi
prelucrat de client. Un client trebuie sã cunoascã metodele oferite de cãtre “Service
Endpoint”, pe care le poate afla din descrierea WSDL.
Serviciile de tip SOAP oferã mai multã flexibilitate, o mai bunã calitate a serviciilor si
interoperabilitate decât serviciile REST si sunt recomandate pentru un API mai mare
oferit clientilor. Serviciile de tip SOAP pot fi combinate pentru realizarea de operatii
complexe, ceea ce a condus la o arhitecturã orientatã pe servicii (SOA=Service Oriented
Architecture).
- Vertraulich / Confidential -
Controalele ASP.NET au o proprietate extrem de importantă din punct de vedere al
performanței: își păstrează starea între postback-uri. ViewState-ul, căci despre el e
vorba, ne ajută din acest punct de vedere, dar prezintă și dezavantaje care vin cu
stocarea stării controalelor: dimensiunea paginii este mai mare, valorile trebuie
serializate / deserializate la salvare / citire din ViewState, etc. Partea bună a lucrurilor
este faptul că ViewState-ul poate fi dezactivat atunci când se consideră că nu este
necesar.
Session tine informatia pe server, iar ViewState pe client. Sintaxa ViewState este identica
cu Session.
8. Ce reprezinta Reflection?
este echivalent cu
pe cand
este echivalent cu
O tranzactie este o secventa de una sau mai multe instructiuni SQL care impreuna
formeaza o unitate de lucru. Se utilizeaza pe baze de date si reprezinta propagarea uneia
sau mai multor schimbari in db.
Se pune la inceputul unei interogari, in cazul in care una dintre operatii esueaza nu se va
efectua nici o modificare asupra bazei de date/tabelului
Se foloseste doar pentru insert,update si delete. Nu se pot folosi cand cream sau stergem
(drop) tabele pentru ca acestea se fac(comit) automat in baza de date
Comenzi folosite:
- Vertraulich / Confidential -
COMMIT-pentru a salva modificarile invocate de o tranzactie, marcheaza sfarsitul unor
operatii executate cu succes
ROLLBACK TRANSACTION-face rollback la toate modificarile de la inceputul tranzactiei
sau pana la savepoint,
TIPURI DE TRANZACTII
1. Tranzactii automate– sunt pornite si incheiate automat de catre server. Serverul initiaza
otranzactie in momentul inceperii unei instructiuni si in functie de succesul comenzii o incheie
sau o inverseaza
4. Tranzactii distribuite folosesc mai multe servere,pot participa doar cele care suporta
specificatia X/Open XA pentru prelucrarea tranzactiilor distribuite.
Decizia de rollback sau commit trebuie sa ia in considerare statusul tuturor interogarilor din
tranzactie sis a aiba acelasi effect pe ambele servere
-transferul prin valoare: Metoda copiaza valoarea parametrului efectiv in parametrul formal al
subrutinei. Modificarile aduse parametrului subrutinei nu vor modifica valoarea parametrului
efectiv.
Modificatorul de parametrii out: -se utilizeaza atunci cand se doreste intoarcerea de catre
metoda a mai multor valori mediului apelant. O instructiune return intoarece o singura
valoare. Daca se doreste intoarcerea spre exemplu a doua valori atunci problema se rezolva
cu ajutorul modificatorului out. -apare atat in declaratia cat si in apelul metodei; -intoarce o
valoare dintr-o metoda. Nu este necesar ca variabila utilizata ca parametru out sa fie
initializata inainte de apelul metodei. Metoda va da acesteia o valoare. Mai mult, in corpul
metodei, un parametru out este considerat ca neinitializat.
- Vertraulich / Confidential -
if (l == L)
patrat = true;
else
patrat = false;
return l * L;
}
Serverul de web “agaţă” browserul prin utilizarea unui cookie. Un cookie este o secvenţă
de cod de dimensiune mică, trimisă de server clientului la accesarea unei pagini de web
şi care este citită de fiecare dată când pagina de web este reânărcată. LA primul apel al
paginii de web, cookie-ul nu există, astfel încât serverul de web va crea o nouă sesiune şi
va plasa ID-ul acelei sesiuni într-un cookie, pe care-l va trimite apoi browserului. În
principiu, se pote stoca diferite informaţii într-un cookie, dar deoarece cu cât mai multa
informaţie este stocată, cu atât mai multă memorie este necesară la server, uzual
cookie+ul conţine un număr minim de informaţii.
Bazat pe acest mecanism, să încercăm să restricţionăm accesul în adăugare şi
editare. Informaţia stocată în cookie este suficient să fie o simplă valoare boolean. Care
să precizeze co utilizatorul are sau nu acces la aceste pagini.
Orice sesiune este lansată la apelul primei pagini dintr-o cerere şi începe prin
lansarea în execuţie a unei funcţii numite Session_Start(), localizată în Global.asax. Să
adăugăm această funcţie:
protected void Session_Start(Object sender, EventArgs e)
{
Session["permis"] = false;
}
Proprietatea Session permite adăugarea de variabile, numite variabile de sesiune.
În funcţie, noi am adăugat o variabilă numită permis, căreia i-am atribuit valoarea false.
Deci, la încărcarea paginii Default.aspx, această variabilă va fi făcută implicit false.
The virtual keyword is used to modify a method, property, indexer, or event declaration and allow for
it to be overridden in a derived class. For example, this method can be overridden by any class that
inherits it:
public virtual double Area()
{
return x * y;
}
- Vertraulich / Confidential -
Ce este o interfata ?
Concluzii:
O interfata nu contine cod pentru implementare, ea contine doar signaturile.
O clasa abstracta poate contine codul complet sau partial, care poate fi rescris.
Din punct de vedere al vitezei de executie, o interfata este mai lenta decat o clasa
abstracta.
- Vertraulich / Confidential -
Modificatorii sealed si abstract nu pot fi folositi impreuna pentru o clasa.
Pentru ca .Net nu permite derivarea multipla, o clasa nu poate deriva din doua clase; in
loc de folosirea claselor abstracte se pot folosi interfete, care se aseamana cu clasele
abstract – definesc un obiect fara a specifica implementarea concreta. O clasa pote
implementa mai mult de o interfata.
- Vertraulich / Confidential -
}
Atat in Finalize cat si in Dispose, in mod normal, ar trebui eliberate resursele unmanaged
folosite de obiect. Diferenta dintre cele doua este, simplu spus, ca Dispose poate fi
executat de user (este ok sa scrii instance.Dispose(), insa Finalise este executat numai
de GC. Nu este legal sa fie executat la “dorinta” programatorului.
…uitasem sa spun: GC vine cand vrea el, in .Net nu este controlabil momentul in care
GC va face munca de curatenie. E la fel ca programatorul care vine la munca intre 8 si
12, in functie de cat de mult a “fumat” cu o zi inainte.
}
Derivata obiect2 = new Derivata();
//instantiem pe un obiect din clasa derivata
Baza obiect1 = obiect2;
//afiseaza functia din clasa de Baza
obiect1.Afiseaza();
obiect2.Afiseaza();
21. Care este obiectul de baza in C#? Care sunt metodele pe care le are acest obiect?
- Vertraulich / Confidential -
Despre .Net Framework putem spune ca reprezinta o biblioteca ce contine o multitudine
de clase pe care le putem folosi intr-o aplicatie dezvoltata in C#. Toate aceste clase
mostenesc Object.
Clasa Object reprezinta clasa de baza pentru toate tipurile din .Net. Fie ca sunt tipuri
valoare, referinta, predefinte sau create de utilizator, toate deriva din clasa Object.
- Equals
-GetType
-GetHashCode;
- ToString
23. Ce inseamna apel prin valoare si apel prin referinta? ( identic 11)
System.Gc
Pentru a programa cu Garbage Collector, in BCL se gaseste clasa Gc.
Un moment in care se poate folosi este cel dupa alocarea unui numar foarte mare de
obiecte si se doreste repede eliberarea memoriei. Sau atunci cand se vrea ca
executarea codului curent sa nu fie intrerupta de un eventual “garbage collection”.
Mai multe detalii despre acesta clasa puteti gasi pe msdn.
Se recomanda ca programatorii sa interactioneze cat mai putin cu System.Gc.
Finalize () – apel implicit
Toti programatorii .Net stiu ca System.Object, clasa de baza, detine o metoda virtuala,
Finalize.
- Vertraulich / Confidential -
Implementarea metodei Finalize se mai numeste finalizer. Un finalizer va elibera doar
resurse externe, continute de obiectul respectiv. Implementarile finalizer sunt apelate de
GC atunci cand obiectul nu mai este folosit (cand spre el nici un alt obiect nu mai are
referinta).
Pentru suprascrierea metodei Finalize nu se foloseste clasicul override.
protected override void Finalize()
{
}
Pentru codul de mai sus, vom primi mesajul de eroare la compilare Do not override
object.Finalize. Instead, provide a destructor.
Procedura corecta consta in definirea unui destructor:
/// <summary>
/// destructor
/// </summary>
~Persoana ()
{
//cod pentru eliberarea resurselor din memorie
}
In cazul unui struct este incorect sa suprascriem Finalize pentru ca o structura este de tip
valoare, iar tipurile valoare nu sunt alocate in heap si nu vor fi luate in considerare
de garbage collecter.
Apelul pentru metoda Finalize va avea loc in momentul in care GC se apeleaza sau
atunci cand se forteaza apelarea lui.
Majoritatea claselor pe care un programator le defineste nu vor avea nevoie de o
eliberare explicita pentru ca vor fi colectate de GC.
- Vertraulich / Confidential -
IDisposable – apel explicit
O alternativa, o sa vedeti ca e mai mai mult o completare, la suprascrierea
metodeiFinalize este implementarea interfetei IDisposable si apelarea singurei metode
definite in aceasta interfata, Dispose.
/// <summary>
/// definitia pentru clasa Persoana care implementeaza interfata IDisposable
/// </summary>
public class Persoana : IDisposable
{
public string Nume { get; set; }
public string Prenume { get; set; }
try
{
p.CalculeazaVarsta();
}
finally
{
p.Dispose();
}
Pentru a scapa de acest “ambalare” intr-o constructie try/finally se poate folosi using.
using (Persoana p = new Persoana("Nume","Persoana"))
{
- Vertraulich / Confidential -
p.CalculeazaVarsta();
}
Exista un articol pe msdn, Implementing Finalize and Dispose to Clean Up Unmanaged
Resources in care se prezinta un pattern, un model, pentru
implementarea IDisposablesi Finalize intr-un mod performant.
Pe scurt, modul cum functioneaza GC:
- Vertraulich / Confidential -
O imagine de ansamblu a codului folosit pentru tratarea exceptiilor:
try
{
//in this block exception may get thrown
}
catch
{
//handle exception
}
finally
{
//cleanup code, optionally
}
Cuvantul cheie try nu poate aparea fara a fi completat de cuvantul cheie catch sau
definally si nici invers. Finally este optional.
Un exemplu simplu de tratare a exceptiei DivideByZeroException si de folosire a
blocului try – catch – finally:
try
{
int x = 0;
//raise the exception
int y = 4 / x;
}
catch
{
//catch the exception
Console.WriteLine("X must be greater than zero");
}
finally
{
//this code will be allways executed
Console.WriteLine("Program completed");
Console.Read();
}
Pot exista mai multe instructiuni catch asociate unui try. Instructiunea care se va executa
se va stabili in functie de tipul exceptiei, celelalte sunt ignorate.
static void Compute(int [] numbers)
{
try
{
int secondNumber = numbers[0];
Console.Write(secondNumber);
}
catch (IndexOutOfRangeException)
{
Console.WriteLine("Must provide more than an argument");
}
catch (NullReferenceException)
{
Console.WriteLine("Argument is null");
- Vertraulich / Confidential -
}
catch (FormatException)
{
Console.WriteLine("Argument is not a number");
}
catch (Exception)
{
Console.WriteLine("Another exception occured");
}
}
Se adauga instructiunile pentru blocurile catch cat mai specifice, inainte celor generale.
CLR cauta instructiunea catch care va trata exceptia. Daca metoda curenta in care ne
aflam cu debug-erul nu contine un bloc catch, atunci CLR va cauta in metoda care a
apelat metoda curenta, si asa mai departe conform call stack. Daca nu este gasit nici
un catch, atunci CLR va afisa un mesaj cum ca exceptia nu este tratata, unhandled
exception message, apoi va opri executia programului.
In general, instructiunea catch nu are un parametru. Totusi, il putem adauga in cazul in
care vom avea nevoie de accesul la obiectul care reprezinta exceptia. Este folositor
pentru furnizarea informatiilor suplimentare despre eroarea produsa.
catch (Exception exception)
{
Console.WriteLine(exception.Message);
Console.WriteLine(exception.GetType());
}
Fluxul executiei programului continua cu instructiunile aflate dupa blocul catch.
Throw
Pentru a lansa manual o exceptie se foloseste throw.
if (numbers == null)
try
{
//open text file for reading
reader = File.OpenText(@"C:\fisier.txt");
//return if the current position is at the end of the stream
if (reader.EndOfStream) return;
//read the content of the stream
Console.WriteLine(reader.ReadToEnd());
- Vertraulich / Confidential -
}
catch (FileNotFoundException)
{
Console.WriteLine("File not found");
}
finally
{
//cleanup code, close the file
if(reader != null)
reader.Dispose();
}
}
Relansarea unei exceptii
Presupunem urmatoarea clasa. In metoda Divide vom trimite
exceptiaDivideByZeroException la un nivel mai sus, in metoda parinte.
class Compute
{
catch(DivideByZeroException)
{
// the control goes back to parent method
throw;
}
}
}
In metoda Main :
static void Main(string[] args)
{
Compute comp = new Compute();
try
{
comp.DivideTwoNumbers(5, 13);
}
catch(DivideByZeroException)
{
Console.WriteLine("Exception caught here");
}
}
System.Exception
Dupa cum s-a putut observa in exemplele de mai sus, exceptiile sunt reprezentate prin
clase. Toate deriva din clasa de baza Exception. Se disting doua clase prin reprezentarea
a doua categorii generale de exceptii: exceptii generate de motorul de
executie SystemException si exceptii generate de programele de
aplicatieApplicationException. Ele nu adauga membri noi la clasa de baza, ci doar
- Vertraulich / Confidential -
definesc radacile celor doua ierarhii de clase care reprezinta exceptii. De exemplu, in
cazul impartirii la zero se produce o exceptie de tipul DivideByZeroException.
Programatorul isi poate defini propriile clase care reprezinta exceptii prin derivarea
clasei ApplicationException.
Pentru mai multe detalii, se poate consulta documentatia de pe msdn.
Un program trebuie sa trateze exceptiile intr-o maniera logica si eleganta si sa isi
continue apoi executia. Daca programul nu intercepteaza exceptia, el va fi fortat sa se
inchida.
Pentru ca tratarea erorilor constituie un subiect dificil voi continua intr-un viitor articol
crearea propriilor clase de exceptii si consecintele exceptiilor neinterceptate.
- Vertraulich / Confidential -
structurii cererii interacţionează cu alte niveluri prin furnizarea de rezultate
pentru toate celelalte niveluri în reţeaua de calcul. Nivelul de logica
controlează funcţionarea aplicaţiei de procesare comenzi, evaluare şi calcul
datele specifice. Informaţii de programare strat ulterior este stocată în
servere de baze de date de nivelul de date. Informaţiile stocate este apoi
transferate înapoi la nivelul de logica pentru o prelucrare ulterioară şi în cele
din urmă la sistemul de calculator utilizatorii.
Supraîncărcarea operatorilor
Supraîncărcarea operatorilor în C# se face numai prin metode statice membre în clase.
Există trei forme de supraîncărcare:
• Operatori de conversie expliciţi (conversia trebuie făcută implicit printr-un
cast) sau impliciţi (conversia poate fi făcută automat de către compilator):
public static implicit operator tip_returnat (NumeClasa param);
sau
public static explicit operator tip_returnat (NumeClasa param);
// copiere elemente
for (int i = 0; i < lista1.NumarPersoane; i++)
lista[i] = new Persoana(lista1[i].Nume, lista1[i].Varsta);
for (int i = 0; i < lista2.NumarPersoane; i++)
- Vertraulich / Confidential -
lista[i + lista1.NumarPersoane] = new Persoana(lista2[i].Nume, lista2[i].Varsta);
// returnare rezultat
return new ListaPersoane(lista);
}
In programare, exista situatii cand trebuie sa executam o anumita actiune, dar fara sa
stim in avans ce metoda sau ce obiect vom apela pentru executarea actiunii. Exemplu :
la apasare, un buton va sti ca trebuie sa notifice un anumit obiect , dar nu stie exact care.
Solutia simpla consta in conectarea butonului la un delegat si apoi acesta sa indice catre
o anumita metoda.
Un delegat este un obiect care poate referi o metoda. Chiar daca nu este un obiect, o
metoda ocupa un loc in memorie, iar aici, la aceasta adresa, va fi transmis controlul la
invocarea metodei.
Un delegat reprezinta modul prin care se realizeaza comunicarea intre obiecte. Un
delegat este un tip referinta si este este echivalentul unui pointer la functie din C++.
Diferenta este ca delegates sunt type-safe si ca sunt orientati pe obiect.
Un delegat se declara cu ajutorul cuvantului delegate.
delegate tip-rez nume (lista-parametri);
tip-rez – tipul valorii intoarse de metodele pe care delegatul le va apela.
nume –numele delegatului.
lista-parametri – lista de parametri necesari metodelor care vor fi apelate prin intermediul
delegatului.
Poate fi declarat in afara unei clase, sau in interior. In functie de cum se vrea
vizibilitatea lui, ii putem aplica modificatorii de acces public, private, protected,etc.
Dupa ce a fost declarat, un delegat poate apela doar metode cu acelasi tip returnat si
aceeasi lista de parametri.
Exemplu :
//declararea unui delegat
delegate int StringLengthDelegate(string str);
delegate string StringReverseDelegate(string str);
Intr-o clasa, construim functiile care vor fi apelate prin delegate.
class DelegateTest
{
//returneaza numarul de caractere al unui sir de caractere
public int StringLength(string str)
{
Console.WriteLine("Va returna numarul de caractere");
return str.Length;
}
- Vertraulich / Confidential -
{
string temp = "";
int i;
Console.WriteLine("Inverseaza sirul.");
//parcurgem sirul invers si concatenam
for (i = str.Length - 1; i >= 0; i--)
temp += str[i];
return temp;
}
}
In metoda Main :
DelegateTest test = new DelegateTest();
//construim delegat
StringLengthDelegate strLength = new StringLengthDelegate(test.StringLength);
//sirul care va fi transmis functiilor
string str;
//apelul unei metode prin intermediul delegarii convertim de la numar la string
//pentru ca functia returneaza int
str = strLength("Test").ToString() ;
Console.WriteLine(str);
//construim delegat
StringReverseDelegate strReverse = new StringReverseDelegate(test.StringReverse);
//apelul unei metode prin intermediul delegarii
str = strReverse("Test");
Console.WriteLine(str);
Pe scurt: avem doua metode statice in clasa DelegateTest ale caror signaturi coincid cu
signaturile delegatilor. In Main, construim referinte de
tipul StringLengthDelegate siStringReverseDelegate, pe care le atribuim metodelor. Se mai
observa ca invocarea delegatilor determina apelul metodelor.Determinarea metodei
apelate se rezolva la momentul executiei, nu la compilare.
Multicasting
Multicasting-ul se defineste ca o facilitate a delegatilor si consta in capacitatea de a
crea un lant de metode care vor fi automat apelate la invocarea unui delegat. Delegarile
multicast trebuie sa returneze un rezultat de tip void, iar pentru crearea lor se folosesc
operatorii += si –=, dupa instantierea unui delegat.
Exemplu :
//declararea unui delegat multicast
delegate void MulticastDelegat(string str);
//construim delegatii
MulticastDelegat multiDel;
MulticastDelegate StringLength = new MulticastDelegat(test.StringLength);
MulticastDelegat StringReverse = new MulticastDelegat(test.StringReverse);
multiDel = StringLength;
//crearea unui delegat multicast
multiDel += StringReverse;
- Vertraulich / Confidential -
Datorita faptului ca la compilare, nu se cunosc metodele care urmeaza a fi executate,
lucrul cu delegate este intalnit in arhitecturile care permit adaugarea componentelor pe
parcurs.
A static constructor is used to initialize any static data, or to perform a particular action that needs to
be performed once only. It is called automatically before the first instance is created or any static
members are referenced.
class SimpleClass
{
// Static variable that must be initialized at run time.
static readonly long baseline;
string s = (string)o;
Throws InvalidCastException if o is not a string. Otherwise, assigns o to s, even
if o is null
string s = o as string;
- Vertraulich / Confidential -
Assigns null to s if o is not a string or if o is null. For this reason, you cannot use it
with value types (the operator could never return null in that case). Otherwise,
assigns o to s.
„As“ is a cast. With it, we gain performance and avoid exceptions when a cast is invalid.
Null is returned when the cast is impossible. For reference types, the as-cast is
recommended. It is both fast and safe.
Tip:
We can test the resulting variable against null and then use it. This eliminates extra
casts.
un assembly mai conține și o secțiune numită Manifest care conține metadate ce descriu
setul de fișiere dintr-un assembly. Din punct de vedere fizic, un assembly se poate identifica
printr-un fișier dll sau exe. Un alt concept cu care operează o aplicație din punct de vedere
structural este domeniul aplicației (AppDomain). Domeniul aplicației conține assembly-urile
cu care operează o aplicație
Indexers allow instances of a class or struct to be indexed just like arrays. Indexers
resemble properties except that their accessors take parameters.
In the following example, a generic class is defined and provided with simple get and set accessor
methods as a means of assigning and retrieving values. The Program class creates an instance of this
class for storing strings.
C#
class SampleCollection<T>
{
// Declare an array to store the data elements.
private T[] arr = new T[100];
- Vertraulich / Confidential -
{
arr[i] = value;
}
}
}
- Vertraulich / Confidential -
Cand e bine sa pornim un thread?
Daca programul e pe cale sa angreneze un proces despre care se stie ca va dura si
pentru ca utilizatorul sa nu astepte, atunci este bine sa pornim thread-ul care va lucra la
procesare, lasand thread-ul principal al UI sa ruleze.
De exemplu, in aplicatia noastra pe care o vom dezvolta, vom avea o metoda care va
realiza un calcul ce va necesita un timp mai mare de executie.
5. Apelam metoda Start(), astfel codul din metoda referinta va fi executat in cadrul thread-ului
respectiv. Acesta nu va porni pana la apelul metodei Start.
6. //PAS3 start thread
firsThread.Start();
Metoda Count:
private void Count()
{
for(int i=0; i<100000;i++)
{
result = +i;
//EXCEPTIE
this.lblInfo.Text = result.ToString();
}
}
In .Net Compact Framework, controale nu pot fi “folosite” de firele de executie care nu
detin propriu-zis controlul( nu putem porni un fir de executie si apoi sa actualizam
elemente din interfata utilizator din acel tread prin interactionarea directa cu controale.
Daca vom face acest lucru, vom primi exceptia:
- Vertraulich / Confidential -
In .Net Framework exista Form.BeginInvoke si Form.EndInvoke, metode care nu sunt In
.Net Compact Framework. Solutia consta in crearea unui delegate pentru o metoda care
va face schimbarile in interfata utilizator. Apoi, folosim Form.Invoke pentru apelul
delegatului din thread.
private void Count()
{
for(int i=0; i<100000;i++)
{
result = +i;
this.Invoke(new EventHandler(UpdateControl));
}
}
- Vertraulich / Confidential -
Stim ca o instanta a clasei Timer este foarte utila atunci cand vrem sa executam cod
la anumite intervale. Clasa Timer este alegerea perfecta atunci cand avem nevoie sa
executam operatii la intervale regulate de timp, dar operatii nu de mare complexitate.
Avantajele clasei Timer asupra clasei Thread in folosirea firelor de executie sunt
controlul usor al executarii codului la un anumit interval, ”sleep” implicit atunci cand nu
se executa codul plus faptul ca in interfata utilizator controalele pot fi accesate de codul
executat de clasa Timer.
In Compact Framework, exista limitari in ceea ce priveste notiunuea de Threading:
45. Cum se poate tipari o imagine direct din cod in ASP.NET pe o pagina web?
Salvarea datelor într-un fișier binar se face prin serializare. Serializarea este o metodă ce
permite transformarea unui obiect într-o secvență de octeți din care să poată fi refăcut
ulterior obiectul original. Serializarea permite unui obiect să fie convertit într-un flux de date,
care apoi este salvat într-un fișier binar.
- Vertraulich / Confidential -
• declararea unei clase ca fiind serializabilă, prin adăugarea înaintea definiției clasei a
atributului [Serializable]
• adăugarea bibliotecilor corespunzătoare: using System.IO; using
System.Runtime.Serialization. Formatters.Binary;
Procesul invers de citire a unui obiect serializat pentru a-i reface starea originală se numește
deserializare. Operația de deserializare presupune parcurgerea etapelor:
Citirea dintr-un fișier XML se poate face utilizând metoda Read() din clasa abstractă
XmlReader din namespace-ul System.Xml. Pașii pentru citire și parsare fișier XML:
• obținerea unui obiect din clasa XmlReader prin apelul metodei Create(): XmlReader reader
= XmlReader.Create(new StringReader(str));
Până acum am văzut cum se pot salva şi restaura în şi din fişiere datele de tip
octet sau caracter. Dar ce e de făcut, dacă avem de salvat şi restaurat date mai
complexe, de exemplu obiecte ale unei clase? Evident, obiectele se pot salva sub
formă de şiruri de octeţi, dar va fi foarte greu la restaurare să împărţim octeţii astfel
încât să recompunem obiectele salvate. Din fericire, majoritatea limbajelor de nivel
înalt, inclusiv C#, implementează un mecnism simplu şi fiabil ne salvare şi restaurare
a obiectelor prin intermediul fişierelor. Acest mecanism poartă denumirea de
serializare.
Orice clasă ale cărei obiecte pot fi salvate sau restaurate prin intermediul
fişierelor, va trebui fie să fie declarată serializabilă, fie să implementeze o interfaţă
specifică, numită ISerializable. În momentul în care infrastructura primeşte o cerere
de serializare a unor obiecte, va verifica întâi dacă clasa din care fac parte obiectele
implementează interfaţa ISerializable şi dacă nu, va verifica dacă a fost declarată ca
fiind serializabilă. Dacă nici una din condiţii nu este îndeplinită, obiectele nu vor
putea fi serializate.
namespace unu_unu
{
[Serializable]
class Rezervare
{
- Vertraulich / Confidential -
public Rezervare()
{
}
public String Nume;
public DateTime DataS;
public DateTime DataP;
public int nrCam;
}
}
Interfata Ienumerator are proprietatea:
object Current {get;}
si metodele :
- Vertraulich / Confidential -
cele doua. Una ar fi ca, interfata IEnumerator<T> nu contine metoda Reset, extinzand,
insa, mai mult, interfata IDisposable.
In exemplul urmator, vom folosi interfetele IEnumerable si IEnumerator pentru a folosi
un foreach pentru obiecte ale clasei Cont, la fel cum il folosim pentru tipurile de baza.
Construim clasa Cont care va contine 3 variabile membru, numarul unic al contului,
numele persoanei care detine contul si soldul contului si vom creea constructorul clasei
(articolul despre introducere in programarea pe obiecte). Mai adaugam si functiatoString, pe
care o vom suprascrie pentru a afisa in consola pentru fiecare obiect al clasei, toti cei trei
membri (articolul despre polimorfism).
//variabile membru
private int numarCurent;
private string numeTitular;
private double sold;
//constructor
public Cont(int numarCurent, string numeTitular, double sold)
{
this.numarCurent = numarCurent;
this.numeTitular = numeTitular;
this.sold = sold;
}
//suprascriem functia
//pentru a afisa toate variabilele membru
public override string ToString()
{
return "Nr.Crt.:" + this.numarCurent.ToString() + "\nNume:" + numeTitular + "\nSold:" + sold.ToString();
}
Vom construi clasa Conturi, care va contine un vector de obiecte Cont. Clasa va
contine si o metoda de adaugare in lista a obiectelor si va implementa cele doua interfete
(articolul despre interfete).
//clasa Conturi
//implementeaza interfetele
class Conturi : IEnumerable,IEnumerator
{
//construim un vector
ArrayList listaConturi = new ArrayList();
- Vertraulich / Confidential -
}
//construim o colectie
ContList.AddEmployee(c1);
ContList.AddEmployee(c2);
ContList.AddEmployee(c3);
Construim obiectul enumerator:
IEnumerator ContEnumerator = ContList.GetEnumerator();
Initial, obiectul enumerator este situat inaintea primului element al colectiei. Vom apela
metoda Reset(), pentru a fi siguri de acest lucru:
ContEnumerator.Reset();
Parcurgem colectia:
//se invoca mai intai metoda MoveNext inainte de accesarea
//Current, altfel va aparea exceptie la executie
while (ContEnumerator.MoveNext())
{
Console.WriteLine((Cont)ContEnumerator.Current);
- Vertraulich / Confidential -
}
Atentie! Folosirea corecta a interfetei IEnumerator presupune mai intai apelul
metodeiMoveNext(), apoi accesarea proprietatii Current.
Obiectul enumerator nu are acces exclusiv asupra colectiei, parcurgerea cu ajutorul
acestuia nu este thread-safe, pentru ca in acelasi timp alte fire de executie pot aduce
modificari colectiei. O solutie ar fi blocarea colectiei in timpul parcurgerii.
Un alt concept cu care operează o aplicație din punct de vedere structural este domeniul
aplicației (AppDomain). Domeniul aplicației conține assembly-urile cu care operează o
aplicație
Fişiere cu extensia .aspx reprezintă locul unde este stocat conţinutul paginii web. Se
pot adăuga elemente HMTL, javascript, controale ASP .NET server-side.
- Vertraulich / Confidential -
referitoare la aplicaţia web. În acest fişier se pot defini mai multe proprietăţi ale
aplicaţiei. De exemplu, putem defini string-ul de conectare la baza de date pentru a-l
putea folosi in orice pagină, sau putem modifica limita mărimii fişierelor upload-ate.
Directorul BIN este folosit pentru a stoca diverse fişiere dll folosite ca şi componente
sau controale în aplicaţie.
Directorul App_Data conţine fişiere mdf specifice bazelor de date SQL sau Access.
Cele trei entitati care stau la baza functionarii .Net sunt: CLR, CTS, CLS.
Common Language Runtime
Cel mai important concept in functionarea .NET il reprezinta Common Language Runtime.
El este un “layer” (nivel, strat) intre sistemul de operare si aplicatiile .Net. Acestea nu
comunica direct cu sistemul de operare, ci prin intermediul CLR.
- Vertraulich / Confidential -
Baza CLR o reprezinta un dll numit mscoree.dll (Common Object Runtime Execution Engine).
Functionalitatile din CLR sunt disponibile pentru orice limbaj de programare .Net folosit.
Daca la runtime se folosesc exceptii pentru a raporta eventuale erori, atunci toate
limbajele vor receptiona erorile prin execeptii.
CLR “nu stie” ce limbaj de programare a fost folosit in fisierele cod-sursa ale
programului. Se poate folosi orice limbaj de programare atat timp cat compilatorul
acestuia este compatabil cu CLR.
Pentru mai multe informatii despre CLR, puteti urmari un interviu cu Ian Carmichael,
despre istoria si viitorul CLR.
Common Type System
.Net este independent de limbaj (suporta peste 20 de limbaje de programare diferite). Cu
toate acestea, un programator se poate folosi de tipurile de date specifice limbajului
preferat, fara a intampina probleme.
De exemplu, in fiecare limbaj exista un cuvant cheie unic pentru a defini un tip de baza
(o variabila de tip intreg este declarata in C# ca int, in Visual Basic este declarata
cainteger sau in C++ ca int. Acestea indica in cele din urma tipul de baza System.Int32 in
.Net Framework, in assembly-ul mscrolib.dll.
Common Type System defineste modul in care tipurile de date urmeaza sa fie declarate
si administrate la executie. Functionalitatea principala a CTS este de a standardiza
conventiile pe care trebuie sa le respecte toate limbajele de programare din .Net. In plus,
CTS se ocupa si de type safety.
Cu ajutorul CTS se elimina probleme legate de overflow/underflow pentru datele
numerice, sau probleme despre reprezentarea tipurilor, de exemplu, string, boolean, etc,
in alte limbaje.
CTS suporta tipurile valoare si tipurile referinta.
- Vertraulich / Confidential -
Fiecare limbaj de programare indica in mod unic, cu ajutorul sintaxei proprii, aceleasi
constructii de programarare (tipuri de date, controlul fluxului) – programming constructs. De
exemplu, in C# concatenarea se poate face cu ajutorul operatorului +, iar in VB se
foloseste &.
Aceste diferente minore sunt aproapte neinsemnate pentru .Net runtime, deoarece
compilatoarele limbajelor respective emit acelasi set de instructiuni in limbaj MSIL.
CLS reprezinta regulile care descriu setul de functionalitati pe care un compilator .Net
trebuie sa il suporte pentru a produce cod care sa fie gazduit de CLR.
Regulile din CLS trebuie cunoscute de cei care dezvolta compilatoare si vor ca
produsele lor sa functioneze perfect in mediul .Net.
CLS Compliance
Exista situatii in care, in C#, este nevoie de “programming constructs” care nu sunt
conforme cu CLS. In aceste cazuri, se poate folosi atributul CLSCompliant pentru a instrui
compilatorul sa verifice fiecare linie de cod din punct de vedere al regulilor CLS. Daca
sunt gasite incalcari ale acestor reguli, vor fi afisate erori de compilare.
Microsoft Intermediate Language
Cand se compileaza un program .Net, codul sursa nu se converteste in cod binar, ci intr-
un cod intermediar numit Micrososft Intermediate Language (MSIL) sau, dupa noua
denumire, Common Intermediate Language.
Cand un *.dll sau *.exe a fost creat cu un compilator .Net, se foloseste termenul
abstract assembly.
Un assembly contine cod CIL (este similar notiunii de bytecod din JAVA) si metadata. De
exemplu, daca am clasa Agent, metadata va contine detalii despre clasa de baza a
clasei Agent, despre interfetele implementate si informatii despre fiecare membru al
clasei.
- Vertraulich / Confidential -
Un assembly este la randul lui descris folosind metadata. Aceste informatii reprezinta
un manifest (detalii despre versiunea curenta a assembly-ului, referinte catre assembly-
uri externe).
In cele mai multe cazuri, exista o singura corespondenta intre un assembly .Net si un
fisier binar (.dll,.exe). In cazul in care scriem un program pentru desktop, executabilul
poate fi referit ca assembly-ul in sine.
Daca un assembly este compus dintr-un singur dll sau exe atunci se numeste single-file
assembly. Acesta contine instructiunile CIL, metadata si fisierul manifest intr-un pachet
bine definit, independent.
Daca un assembly este compus din mai multe fisiere binare, el se numeste multi-file
assembly. Fiecare fisier component poarta numele de modul. Unul din aceste module
trebuie sa fie considerat principal si sa contina fisierul manifest al assembly-ului.
Codul MSIL contine instructiuni care sunt independente de orice CPU. Este treaba CLR
sa transforme acest cod intermediar intr-un cod executabil pe un mediu in care regulile
CLR sunt implementate.
Compilatorul JIT
Atunci cand codul CIL compilat trebuie sa fie executat, CLR invoca compilatorul Just In
Time (Jitter). Acesta va compila instructiunile CIL in cod executabil specific masinii sau
sistemului de operare. Compilatoarele JIT se diferentiaza de cele traditionale prin faptul
ca ele transforma codul CIL in cod nativ doar cand e nevoie. De exemplu, atunci cand o
functie este apelata, codul CIL al functiei este convertit in cod nativ chiar atunci,just in
time. Daca o sectiune de cod CIL este convertita la cod nativ, data viitoare cand este
nevoie de aceasta, CLR va folosi aceeasi copie (deja compilata) fara a recompila.
Compilatoarele JIT optimizeaza codul in functie de procesor si sistem de operare, la
executie. Microsoft spune ca C# si .Net nu concureaza cu C++ din punct de vedere al
eficientei si al vitezei de executie, dar in anumite cazuri datorita compilatoarelor JIT,
codul poate devine mai rapid decat in C++.
- Vertraulich / Confidential -
BCL incapsuleaza functii pentru lucrul cu thread, I/O, grafica, interactiune cu dispozitive
hardware externe. De asemea, BCL furnizeaza suport pentru servicii apelate de aplicatii
din lumea reala (acces la baza de date, manipularea documentelor XML, securitate).
Observatie: A nu se confunda BCL cu FCL. Chiar daca nu are un mare impact asupra
dezvolatorilor, consider ca este util sa cunoastem aceste diferente.
FCL reprezinta tot ce este inclus in instalarea .Net (ADO.NET, ASP.NET, WPF, etc).
Concluzii
In ansamblu, .Net Framework se bazeaza pe un motor de executie, runtime,
(mscoree.dll) si pe o vasta librarie de clase (mscorlib.dll plus alte referinte).
Exista implementari ale .Net Framework, open-source, de exemplu, Mono, care permit
programelor sa ruleze pe Mac Os si Unix.
In acest exemplu, sirul s1 este creat si apoi modificat. In acest fel exista doua versiuni
ale variabilei s1 ce vor fi stocate temporar in memorie. Metoda string.Concat creaza un nou
- Vertraulich / Confidential -
sir si concateneaza s1 cu rezultatul metodei ToString. Rezultatul acestei concatenari este o
noua locatie de memorie. Cand o astfel de operatie apare intr-o bucla, pot apare probleme
cu memoria si performanta generala a programului.
Solutia este sa utilizati clasa StringBuilder din spatiul de nume System.Text.
StringBuilder aloca initial un spatiu pentru 16 caractere; daca sirul devine mai mare decat
atat, el este marit automat. In urmatorul exemplu va fi alocat un singur string:
Clasele şi funcţiile template sunt şabloane pe baza cărora se pot genera clase şi funcţii
folosind un mecanism de expandare asemănător cu macrodefiniţiile cu parametri. Spre
deosebire de macrodefiniţii, template-urile oferă mecanisme de înlocuire doar pentru
tipuri de date şi constante, însă au avantajul unei verificări mai bune de către
compilator.
Sintaxa utilizată pentru definirea şabloanelor de funcţii este:
template <class T1, class T2, …, class Tn, tip1 c1, …, tipm cm> prototip_functie
Metodele implementate inline în cadrul clasei folosesc sintaxa obişnuită. În cazul în care se
doreşte implementarea metodelor în afara clasei se va folosi sintaxa:
- Vertraulich / Confidential -
După sursele de date special au fost determinată și setată pentru obiectele din
pagina .aspx, trebuie să legați datele la aceste surse de date. UtilizațiPage.DataBind sau
metoda Control.DataBind a lega datele la surse de date.
Generice şi colecţii de generice (eng. generics) .NET Framework 2.0 Beta introduce
suport pentru generice în scopul facilitării „scrierii” de cod flexibil şi reutilizabil.
Exista si StringCollection, o colectie tipizata. Impreuna cu alte colectii din .Net care sunt
strongly typed, aceste clase tipizate sunt usor de folosit in dezvoltare datorita faptului ca
Visual Studio poate face automat validarea si nu mai e nevoie sa folosim conversia.
Provides methods for creating, manipulating, searching, and sorting arrays, thereby serving as the base
class for all arrays in the common language runtime.
A thread pool is a collection of threads that can be used to perform several tasks in the background.
(See Using Threading (C# Programming Guide) for background information.) This leaves the primary
thread free to perform other tasks asynchronously.
Thread pools are often employed in server applications. Each incoming request is assigned to a thread
from the thread pool, so that the request can be processed asynchronously, without tying up the
primary thread or delaying the processing of subsequent requests.
Once a thread in the pool completes its task, it is returned to a queue of waiting threads, where it can
be reused. This reuse enables applications to avoid the cost of creating a new thread for each task.
- Vertraulich / Confidential -
Thread pools typically have a maximum number of threads. If all the threads are busy, additional tasks
are put in queue until they can be serviced as threads become available.
Un thread pool este o colectie de fire de lucru care executa asincron metode callback. Thread
pool furnizeaza un management al firelor de lucru.
72. Cum pot la apasarea tastei Enter sa fac submit la o pagina ASP.NET ca si cum as fi
apasat un anume buton?
73. Ce reprezinta uncheked?
92. Moduri in care putem sa face din protocolul Http un protocol cu stari dintr-unul fara
stari.
- Vertraulich / Confidential -
95. Cum se poate transmite un mesaj de tip Email din C#?
Design Patterns.
1. Ce este un singleton?
Creational patterns - sabloane care ajuta la crearea de obiecte in loc sa trebuiasca sa fie
instantiate direct. Astfel se ofera mai multa flexibilitate permitind sa se decida ce obiecte
trebuie sa fie create intr-o anumita situatie data.
Conceptul se numeste singleton. Reprezinta o tehnica prin care se limiteaza numarul de instante
ale unei clase la una singura. Cu alte cuvinte nu pot construi decat un singur obiect din aceasta
clasa.
2. Ce este un adapter?
Structural patterns - Se refera la compunerea claselor si a obiectelor pentru a obtine noi
functionalitati.
- Vertraulich / Confidential -
Bridge - decupleaza o clasa abstracta de implementarea sa a.i cele doua sa poata varia
independent.
Composite - compune mai multe obiecte similare a.i ele pot fi manipulate ca un singur
obiect.
Flyweight - reduce costul crearii si manipularii unui numar mare de obiecte similare.
Proxy - furnizeaza un obiect de tip placeholder (tipic local) pentru a accesa un alt obiect
(tipic remote).
"Adaptor". Acest model particular poate fi folosit atunci cand codul vostru
depinde de API-uri externe sau orice alta clasa predispusa schimbarilor
frecvente. Acest model face parte din categoria "modelelor structurale"
deoarece ne invata modul in care codul si clasele noastre trebuie
structurate pentru a le putea organiza si/sau extinde cu usurinta.
using System;
2
- Vertraulich / Confidential -
3 // Adapter Pattern - Simple Judith Bishop Oct 2007
4 // Simplest adapter using interfaces and inheritance
5
6 // Existing way requests are implemented
7 class Adaptee {
8 // Provide full precision
9 public double SpecificRequest (double a, double b) {
10 return a/b;
11 }
12 }
13
14 // Required standard for requests
15 interface ITarget {
16 // Rough estimate required
17 string Request (int i);
18 }
19
20 // Implementing the required standard via Adaptee
21 class Adapter : Adaptee, ITarget {
22 public string Request (int i) {
23 return "Rough estimate is " + (int) Math.Round(SpecificRequest
(i,3));
24 }
25 }
26
27 class Client {
28
29 static void Main ( ) {
30 // Showing the Adapteee in standalone mode
31 Adaptee first = new Adaptee( );
32 Console.Write("Before the new standard\nPrecise reading: ");
33 Console.WriteLine(first.SpecificRequest(5,3));
34
35 // What the client really wants
36 ITarget second = new Adapter( );
37 Console.WriteLine("\nMoving to the new standard");
38 Console.WriteLine(second.Request(5));
39 }
40 }
41/* Output
42 Before the new standard
43 Precise reading: 1.66666666666667
44
45 Moving to the new standard
46 Rough estimate is 2
47 */
3. Ce este un enumerator?
MS SQL 2000
- Vertraulich / Confidential -
2. De cate tipuri sunt joinurile? Comentarii!
Indiferent de sintaxa folosită există mai multe moduri de legare a tabelelor şi anume:
Produsul cartezian – leagă fiecare înregistrare dintr-o tabelă cu toate
înregistrările din cealaltă tabelă.
Equijoin – sunt legate două tabele cu ajutorul unei condiţii de egalitate
NonEquijoin - în acest caz condiţia de join foloseşte alt operator decât
operatorul de egalitatea
SelfJoin – este legată o tabelă cu ea însăşi, e folosită de obicei în conjuncţie cu
relaţiile recursive.
OuterJoin – sunt o extensie a equijoinului, când pentru unele înregistrări dintr-
o tabelă nu există corespondent în cealaltă tabelă, şi dorim ca aceste înregistrări
fără corespondent să fie totuşi afişate.
3. Ce reprezinta un cursor?
7. Ce reprezinta trigerele?
11. SQL 2005 nu vine din start cu connection=-ul de pe alte calculatoare enabled. Ce
trebuie sa fac sa permit aceasta?
12. Care sunt avantajele procedurilor stocate? Cand se recompileaza procedurile stocate
pe server?
Intrebari generale
3. Ce reprezinta un semafor?
6. Ce este un DTD?
- Vertraulich / Confidential -
8. Ce este un XSL?
9. Ce este XHTML?
- Vertraulich / Confidential -