C#: proiectează schema SQL înaintea formularelor
Proiectează tabelele pentru o aplicație C# de bibliotecă. Separă entitățile, alege cheile și pregătește date de test înainte de a construi ecranele de editare.
În acest material
Schema bazei de date fixează ce informații poate reprezenta aplicația și ce contradicții trebuie refuzate. Începem cu Books și Loans, folosind identificatori expliciți. Exemplul este intenționat mic: numele cititorului este text în Loans. Un proiect cu editarea cititorilor ar introduce un tabel Readers și o cheie ReaderId.
Cum lucrezi cu exemplul
Schema și interogarea sunt disponibile în arhiva lecției. Verificarea semantică folosește SQLite în memorie; integrarea Access/OleDb se face separat pe Windows, după pregătirea formatului și providerului potrivit.
Descarcă sursele și instrucțiunile.
Ideea și pașii de implementare
Books are BookId, Title și Category. Loans are LoanId, BookId și ReaderName. Relația leagă Loans.BookId de Books.BookId. Titlul nu este cheie: două ediții pot avea același titlu. Numele coloanelor sunt stabile și nu includ spații, pentru a reduce citarea specifică dialectului SQL.
Scriptul de mai jos descrie schema și datele de exercițiu în SQL uzual. Exemplele de interogare sunt verificate semantic într-o bază SQLite temporară. Pentru lecțiile OleDb creează separat catalog.accdb în Access: ID-urile ca Number/Long Integer, textele ca Short Text cu limitele indicate și relația cu integritate referențială. Nu redenumi un fișier SQLite în .accdb.
Exemplu și rezultat așteptat
Avem trei cărți și trei împrumuturi: două pentru cartea 1, unul pentru cartea 2 și niciunul pentru cartea 3. Interogarea de control întoarce exact trei cărți. Acest set mic este suficient pentru a testa și relația fără copii, pe care un set cu toate cărțile împrumutate ar ascunde-o.
Books: 1, 2, 3 → Loans: 10→1, 11→1, 12→2 → Cartea 3: fără împrumut → Control: 3 cărți.Mărește schema ↗
Schema și datele de test
CREATE TABLE Books(BookId INTEGER PRIMARY KEY,Title VARCHAR(80) NOT NULL,Category VARCHAR(40) NOT NULL);
CREATE TABLE Loans(LoanId INTEGER PRIMARY KEY,BookId INTEGER NOT NULL REFERENCES Books(BookId),ReaderName VARCHAR(80) NOT NULL);
INSERT INTO Books VALUES(1,'Algoritmi','Programare'),(2,'Grafuri','Programare'),(3,'Povesti','Literatura');
INSERT INTO Loans VALUES(10,1,'Ana'),(11,1,'Mihai'),(12,2,'Ana');
Interogarea verificată
SELECT COUNT(*) AS BookCount FROM Books;
Rezultatul, în ordinea rândurilor:
3
Greșeli și limite
Nu presupune că toate dialectele SQL au aceeași sintaxă pentru autonumerotare, booleeni sau date calendaristice. Nu instala un provider la întâmplare în timpul concursului: verifică mediul disponibil. Folosește o copie de test a bazei; exercițiile de actualizare vor modifica date.
Exersează
Adaugă Readers pe hârtie și rescrie relația din Loans. Pregătește un cititor fără împrumuturi și unul cu două. Verifică ce operații ar trebui refuzate la ștergerea unei cărți referite. Scrie politica înainte să alegi ștergerea în cascadă.
Continuă parcursul
Parcursul complet de 50 de lecții
Lecția precedentă: C#: relații și chei în DataTable și DataSet
Lecția următoare: C#: interogări SQL cu filtrare și ordine stabilă.
Referință: documentația Microsoft.
Întrebări frecvente
Pot folosi titlul drept cheie?
Nu este o identitate sigură, fiindcă se poate repeta sau modifica.
SQLite și Access folosesc același fișier?
Nu. Sunt formate și provideri diferiți. Testele semantice SQL nu dovedesc integrarea Access.
De ce includ o carte fără împrumuturi?
Pentru a verifica interogările care trebuie să păstreze și entitățile fără rânduri copil.
Un pas mai departe
Autentifică-te pentru a păstra progresul în cont.