Configurarea Bazei de Date Ms Sql Manager de Locatii
Configurarea bazei de date MS SQL
Manager de locații
Cuprins
Introducere
Capitolul I. Elemente de MS SQL utilizate la elaborarea aplicației
I.1. MS SQL Express LocalDB
I.2. Operații MS SQL
I.2.1.Tabele
I.2.1.1. Crearea unui tabel
I.2.1.2. Modificarea unui tabel
I.2.1.3. Ștergerea unui tabel
I.2.2 Vizualizari
I.2.2.1. Crearea unei vizualizări
I.2.2.2. Modificarea unei vizualizări
I.2.2.3. Ștergerea unei vizualizări
I.2.3 Functii
I.2.2.1. Crearea unei funcții „table-valued
I.2.2.2. Crearea unei funcții „scalar-valued
I.2.4 Proceduri stocate
I.2.4.1. Crearea unei proceduri stocate
I.2.4.2. Modificarea unei proceduri stocate
I.2.4.2. Ștergerea unei proceduri stocate
Capitolul II. Controale DevExpress utilizate la elaborarea aplicației
II.1. Prezentare generala
II 2. Controale Devexpress
Capitolul III. Aplicație interfața grafică
III.1. Descriere aplicație interfața grafică
III 2. Membri
III.2.1. Adăugarea unui membru nou
III.2.2. Modificarea unui membru existent
III.2.2. Ștergerea unui membru
III.3. cărți
III.3.1. Adăugarea unei cărți noi
III.3.1. Modificare datelor unei cărți existente
III.3.1. Ștergerea unei cărți
III.4. Dulapuri
III.4.1. Adăugarea unui dulap nou
III.4.2. Ștergerea unui dulap
Capitolul IV.
Aplicație baza de date
IV.1. Preluarea informațiilor
IV.2. Introducerea de noi informații si modificarea informațiilor existente
Concluzii (eventual propuneri
Bibliografie
Anexe (figuri, tabele, poze, etc
Introducere
Majoritatea bibliotecilor fizice care stochează materiale „media” precum cărți, articole, filme, etc, adera mai mult sau mai puțin unora dintre legile sistemului Dewey Decimal System[1], in folosirea metodelor de etichetare, stocare, identificare si recuperare a materialelor stocate folosind identificatori unici.
Folosirea acestor sisteme au forțat bibliotecarii sa dezvolte un set de sisteme care sa-i ajute atât pe bibliotecari cat si pe cei care folosesc bibliotecile. Bineînțeles, timpurile sau schimbat si sistemele au devenit digitale. Eu am încercat sa pun in practica aceste concepte prin implementărea unui sistem informatic(digital) de gestiune a unei biblioteci.
Programul pe care l-am creat țintește bibliotecile de orice mărime având o scalabilitate foarte flexibila prin modulele separate de creare a spatiilor de stocare (dulapuri) de orice mărime, adăugare de membri, adăugare de cărți si de asocierea cărților cu membri selectați.
Capitolul I.
Elemente de MS SQL utilizate la elaborarea aplicației
Bazele de date sunt programe care înmagazinează datele unei aplicații pentru a fi accesate ori de cate ori aplicația rulează si pot fi formate dintr-un fișier sau mai multe fișiere.
SQL (Structured Query Language) este un limbaj de programare a bazelor de date universal care este utilizat pentru a crea, interoga, actualiza și configura bazele de date relaționale. SQL este simplu si accesibil, dar în același timp poate oferi si facilități deosebit de complexe. Este un limbaj non-procedural, adică se specifică ce informație este solicitată, dar nu modul cum se obține această informație. SQL poate fi utilizat autonom sau prin crearea de comenzi într-un limbaj de programare.
În SQL sunt trei feluri de comenzi:
Comenzi pentru definirea datelor
Comenzi pentru manipularea datelor
Comenzi pentru controlul datelor
Tipuri de date
Principale tipuri de date se regăsesc în următoarele categorii :
date sir ( CHAR , VARCHAR, NVARCHAR, TEXT ),
date numerice (DECIMAL, FLOAT, INT, BIGINT ),
date data/ora ( DATE, DATETIME, TIME )
date binare ( BINARY, VARBINARY ).
Datele de tip șir pot fi limitate la o anumită lungime maximă.
In cazul tipurilor de date sir unde lungimea este nelimitata se folosește tipul TEXT.
Din motive de performanta este recomandat să se folosească tipul care oferă facilitățile cele mai apropiate de cele dorite.
Nu ar fi o alegere buna sa se folosească tipul TEXT pentru a stoca numele unei persoane.
I.1. MS SQL Express LocalDB
Versiunea Microsoft SQL Express LocalDB a fost creata special pentru dezvoltatorii de software pentru a dezvolta soft-uri care nu necesita instalarea, configurarea si întreținerea unui Server SQL. Este foarte ușor de instalat si oferă același limbaj de programare si conectivitate locala ca si un Server SQL express.
LocalDB are următoarele principale proprietăți:
Folosește același proces (sqlserv.exe) ca un Server SQL, deci aplicația care folosește o baza de date SQL poate foarte simplu de la conectarea la un SQL Server la LocalDB doar prin schimbarea string-ului de conectivitate in fișierul de configurare al aplicației.
Se instalează doar odată pe un computer si mai multe aplicații pot începe mai multe procese LocalDB.
Nu creează nici un serviciu care sa ruleze in fundal, iar procesele LocalDB sunt chemate când se pornește aplicația care le folosește si oprite automatic când aplicația este închisa.
La fel ca instanțele unui SQL Server, se poate accesa folosind Microsoft SQL Management Studio de unde se poate crea noi baze de date sau aduce modificări unei baze de date existente.
I.2. Operații MS SQL
I.2.1. Tabele
Orice bază de date conține tabele. De asemenea fiecare tabel este conține mai multe coloane care sunt identificate printr-un nume unic în tabel. Fiecare coloana conține informații in formatul de tip de date specificat când s-a creat coloana. Fiecare tabela are o cheie primara prin care se specifica pentru a se identifica corect informațiile dintr-o tabela. Cheile primare trebuie sa conțină valori unice si nu pot conține valori nule. O tabela nu poate avea mai mult de o cheie primara.
De asemenea, o tabela poate avea una sau mai multe chei externe pentru a indica spre chei primare din alte tabele.
I.2.1.1. Crearea unui tabel
Pentru a crea un tabel, utilizatorul trebuie să aibă acest privilegiu și să dispună de spațiul de memorie în care să creeze obiectul. Când se creează un tabel trebuie specificat numele tabelului, numele coloanelor care vor fi parte din acest tabel, si tipul de date a fiecărei coloane. De asemenea se poate specifica o cheie primara si eventualele chei externe.
Exemplu:
CREATE TABLE [dbo].[TBL_BOOKS](
[BOOK_ID] [bigint] IDENTITY(1,1) NOT NULL,
[CONTACT_ID] [bigint] NOT NULL,
[BOOK_NAME] [nvarchar](50) NULL,
[AUTHOR_CONTACT_ID] [bigint] NULL,
[BOOK_PAGES] [int] NULL,
[BOOK_RELEASE_DATE] [date] NULL,
[BOOK_OBS] [nvarchar](4000) NULL,
[COPIES] [int] NULL,
[INS_DT] [datetime] NULL,
[UP_DT] [datetime] NULL,
[RACK_LOCATION_ID] [bigint] NULL,
CONSTRAINT [PK_TBL_BOOKS] PRIMARY KEY CLUSTERED
( [BOOK_ID] ASC)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY]
GO
ALTER TABLE [dbo].[TBL_BOOKS] WITH CHECK ADD CONSTRAINT [FK_TBL_BOOKS_TBL_RACK_LOCATIONS] FOREIGN KEY([RACK_LOCATION_ID])
REFERENCES [dbo].[TBL_RACK_LOCATIONS] ([RACK_LOCATION_ID])
GO
ALTER TABLE [dbo].[TBL_BOOKS] CHECK CONSTRAINT [FK_TBL_BOOKS_TBL_RACK_LOCATIONS]
GO
I.2.1.2. Modificarea unui tabel
Comanda folosita care realizează modificări ale structurii tabelului la nivel de coloană sau la nivel de tabel, dar nu modificarea datelor din acest tabel, este ALTER TABLE.
Principalele cazuri in care comanda ALTER TABLE se folosește sunt:
adăugarea de coloane, chei sau constrângeri într-un tabel existent (ADD)
specificarea unei valori implicite la o coloană din tabelul in cauza (DEFAULT)
ștergerea unei coloane existente (DROP)
Exemplu:
ALTER TABLE [dbo].[TBL_BOOKS]
ADD BOOK_NAME NVARCHAR(50)
ALTER COLUMN BOOK_NAME TEXT
DROP COLUMN BOOK_NAME
Observații
Schimbarea unei coloane din NULL în NOT NULL nu se poate face dacă fiecare linie a coloanei respective nu conține o valoare.
I.2.1.3. Ștergerea unui tabel
Ștergerea unui tabel implica:
ștergerea definiției din dicționarul datelor;
ștergerea indecșilor asociați acestuia;
recuperarea spațiului alocat tabelului;
invalidarea vizualizărilor, procedurilor si funcțiilor, care folosesc tabelul in cauza.
Ștergerea unui tabel este o acțiune ireversibilă. Când un tabel este suprimat informațiile nu mai pot fi recuperate daca nu exista o copie de rezerva, nici măcar folosind comanda ROLLBACK.
Exemplu:
DROP TABLE [dbo].[TBL_BOOKS]
I.2.2. Vizualizări
In teoria bazelor de date, o vizualizare este tabel virtual care conține una sau mai multe tabele, sau părți a acestora pe care utilizatori bazei de date o pot folosi pentru interogare la fel cum ar interoga direct acele tabele.
Avantajele folosiri vizualizărilor in comparație cu folosirea directa a tabelelor sunt:
O mai buna securizare a bazei de date
simplificarea interogării mai multor tabele deodată
asigurarea independenței informațiilor
Informațiile pot fi prezentate deja calculate după necesități
restricționarea accesului la baza de date
Ocupa puțin spațiu
I.2.2.1. Crearea unei vizualizări
Exemplu:
CREATE VIEW [dbo].[View_Books]
AS
SELECT BOOK_ID,
CONTACT_ID,
BOOK_NAME,
AUTHOR_CONTACT_ID,
BOOK_PAGES,
BOOK_RELEASE_DATE,
BOOK_OBS,
COPIES,
INS_DT,
UP_DT,
RACK_LOCATION_ID
FROM dbo.TBL_BOOKS
Observații
Numărul coloanelor specificate în definiția vizualizării trebuie să fie egal cu cel din lista comenzii SELECT.
I.2.2.2. Modificarea unei Vizualizări
Exemplu:
ALTER VIEW [dbo].[View_Books]
AS
SELECT BOOK_ID,
CONTACT_ID,
BOOK_NAME,
AUTHOR_CONTACT_ID,
BOOK_PAGES,
BOOK_RELEASE_DATE,
BOOK_OBS,
COPIES,
RACK_LOCATION_ID
FROM dbo.TBL_BOOKS
Modificarea unui vizualizări are următoarele efecte:
definiția vizualizării este actualizată;
nici o tabela nu este afectata
toate restricțiile care existau în vizualizarea originală sunt distruse;
I.2.2.3. Ștergerea unei Vizualizări
Exemplu:
DROP VIEW [dbo].[View_Books]
Observații
Ștergerea vizualizării nu va afecta tabelele din care a fost definită vizualizarea.
Aplicațiile și vizualizările care se folosesc de vizualizarea ștearsa nu vor mai funcționa.
I.2.3. Funcții
SQL Server Express LocalDB suportă două feluri de funcții:
Funcțiile incorporate care nu se pot modifica precum funcțiile agregate
Funcțiile predefinite de utilizator precum funcțiile
„table-valued functions” care returnează o tabelă virtuala care sunt o puternica alternativa a vizualizărilor
„scalar valued functions” care conțin cod pentru a putea fi refolosit si care returnează o variabila.
I.2.3.1 Crearea unei funcții „table-valued”
Exemplu:
CREATE FUNCTION [dbo].[fnt_Get_Books]()
RETURNS
TABLE
As
RETURN
(select b.BOOK_ID,
b.BOOK_NAME,
b.BOOK_OBS,
b.BOOK_PAGES,
b.BOOK_RELEASE_DATE,
b.COPIES,
b.CONTACT_ID,
b.AUTHOR_CONTACT_ID,
b.INS_DT,
b.UP_DT,
a.AUTHOR_NAME,
r.RACK_NAME,
r.CONTACT_ID as RACK_CONTACT_ID,
rl.RACK_LOCATION_ID,
isnull(rl.RACK_VERTICAL_LOCATION,0) as RACK_VERTICAL_LOCATION,
isnull(rl.RACK_HORIZONTAL_LOCATION,0) as RACK_HORIZONTAL_LOCATION
from TBL_BOOKS as b
left outer join TBL_AUTHORS as a on a.CONTACT_ID = b.AUTHOR_CONTACT_ID
left outer join TBL_RACK_LOCATIONS as rl on rl.RACK_LOCATION_ID = b.RACK_LOCATION_ID
left outer join TBL_RACKS as r on r.RACK_ID = rl.RACK_ID)
I.2.3.2 Crearea unei funcții „scalar-valued”
CREATE FUNCTION [dbo].[fn_CheckAuthorIsUsed] (@p_AUTHOR_CONTACT_ID bigint)
RETURNS int
AS
BEGIN
declare @Ret int
if(SELECT COUNT(1) FROM TBL_BOOKS WHERE AUTHOR_CONTACT_ID = @p_AUTHOR_CONTACT_ID) > 0
begin
set @Ret = 1
end
else
begin
set @Ret = 0
end
return @Ret
END
I.2.4. Proceduri stocate
Procedurile stocate sunt un set de instrucții grupate pentru a efectua anumite sarcini
Beneficiile folosiri procedurilor stocate sunt:
Reduce cantitatea de informație trimisa către baza de date
Compilația este necesara doar când procedura stocata este creata
Odată compilata poate fi folosita de mai mulți clienți
O mai buna securizare a bazei de date
I.2.4.1 Crearea unei proceduri stocate
Exemplu:
CREATE PROCEDURE [dbo].[sp_Book_Insert]
(
@p_BOOK_NAME nvarchar (50),
@p_AUTHOR_CONTACT_ID bigint,
@p_BOOK_PAGES int,
@p_BOOK_RELEASE_DATE date,
@p_BOOK_OBS nvarchar (4000),
@p_COPIES int,
@p_RACK_LOCATION_ID bigint
)
AS
–insert the new book
insert into TBL_BOOKS
(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES,BOOK_RELEASE_DATE,
BOOK_OBS,COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)
values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_RELEASE_DATE, @p_BOOK_OBS, @p_COPIES, @ContactId, @TodayDate, @TodayDate,@p_RACK_LOCATION_ID)
I.2.4.2 Modificarea unei proceduri stocate
Exemplu:
ALTER PROCEDURE [dbo].[sp_Book_Insert]
(
@p_BOOK_NAME nvarchar (50),
@p_AUTHOR_CONTACT_ID bigint,
@p_BOOK_PAGES int,
@p_BOOK_OBS nvarchar (4000),
@p_COPIES int,
@p_RACK_LOCATION_ID bigint
)
AS
–insert the new book
insert into TBL_BOOKS
(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES ,
BOOK_OBS,COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)
values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_OBS, @p_COPIES, @ContactId, @TodayDate, @TodayDate,@p_RACK_LOCATION_ID)
I.2.4.3 Ștergerea unei proceduri stocate
Exemplu:
DROP PROCEDURE [dbo].[sp_Book_Insert]
Capitolul II.
Controale DevExpress utilizate la elaborarea aplicatiei
II.1. Prezentare generala
Pentru o experiență mai bogata si un design mai frumos, am folosit controalele găsite in librăriile puse la dispoziție de către firma DevExpress[2] , firma de talie mondiala si cu o lunga experiență in domeniul creări de module pentru a le pune la dispoziție programatorilor de pretutindeni.
II.2. Controale DevExpress
Cele mai importante module folosite in aplicația in cauza sunt:
Data Grid care este un puternic control pentru a afișa si administra un set de date cu multe caracteristici care deservesc utilizatorului precum căutare, sortare etc.
NavBar Menu este un control de meniu care afișează link-uri sortate in grupuri care pot fi extinse sau contracta pentru a ascunde sau afișa link-urile acestor grupuri
ValidationProvider este un component care permite programatorului sa seteze diferite reguli pentru a le putea asocia cu diferite controale ale aplicației.
Capitolul III.
Aplicație interfața grafică
III.1. Descriere aplicație interfața grafică
Aplicația pe care am creat-o este un manager de locații care in acest caz am personalizat-o pentru a fi folosita de către o biblioteca non-profit intr-un mod simplu si rapid.
Conține trei module:
Membri,
Cărti
Dulapuri
Pentru a stoca informațiile, se folosește baza de date Microsoft SQL Express LocalDB
Pornirea aplicației se face accesând iconița prin dublu-click.
Închiderea aplicației se face prin un singur click pe butonul „Închide” din meniu.
Observații
Unele din câmpurile ferestrelor-dialog in aceasta aplicație sunt obligatorii. De exemplu in acest caz daca nu se completează numele membrului se va atenționa utilizatorul când va încerca sa salveze datele.
III.2. Membri
La pornirea aplicației primul modul vizibil este cel al membrilor bibliotecii (Vezi fig. 1)
Figura 1
Acest modul fiind accesat, observam ca butonul „Membri” devine inaccesibil in grupul „Vederi” al meniului din stânga aplicației in timp ce celelalte butoane din acest grup sunt accesibile, iar in grupul „Acțiuni” sunt vizibile doar butoanele care au legătura cu acest modul. In tabelul „Lista Membri” sunt afișați toți membri bibliotecii iar in gridul „Cărți Membru” sunt listate toate cărțile pe care membrul selectat in primul Grid le-a preluat din aceasta biblioteca. La selectarea altui membru lista de cărți se va actualiza in funcție de situația membrului nou selectat.
Pentru a asocia o carte noua, trebuie selectat membrul in cauza si la apăsarea butonului „Asociază carte” se va deschide o fereastra dialog cu toate cărțile disponibile in aceasta biblioteca (vezi figura2).
Figura 2
Observații
Daca o carte care a fost introdusa cu un număr de 5 exemplare, si a fost deja asociata cu cinci membri, nu va mai fi listata in fereastra-dialog „Lista Cărți”.
III.2.1. Adăugarea unui membru nou
Pentru a adăuga un membru nou se apasă pe butonul „Adaugă Membru” care va deschide o fereastra dialog pentru a specifica datele personale ala noului membru (Vezi figura 3).
Figura 3
III.2.2. Modificarea unui membru existent
Pentru a modifica datele unui membru existent, trebuie selectat din lista de membri si se poate apasă butonul „Modifica Detalii Membru” sau se da dublu-click pe membrul respectiv in lista de membri care va deschide o fereastra dialog cu datele personale ala membru încărcate (Vezi figura 4).
Figura 4
După ce au fost făcute modificările dorite se apasă butonul „Salvează”.
III.2.2. Ștergerea unui membru
Pentru a șterge un membru, trebuie selectat in lista de membri si apoi se poate apasă buton „Șterge Membru” sau se poate apasă tasta „Delete” de pe tastatura calculatorului si o fereastra-dialog va apărea cerându-va sa confirmați ștergerea membrului (Vezi figura 5).
Figura 5
Observații
Daca la membrul care se dorește a fi stres sunt cărți asociate, ștergerea nu va putea fi făcută. Vor trebuie dezasociate toate cărțile, după care ștergerea se poate face (vezi figura 6).
Figura 6
III.3. cărți
Figura 7
Acest modul fiind accesat, observam ca butonul „cărți” devine inaccesibil in grupul „Vederi” al meniului din stânga aplicației in timp ce celelalte butoane din acest grup devin accesibile, iar in grupul „Acțiuni” sunt vizibile doar butoanele care au legătura cu acest modul. In gridul „Lista cărți” sunt afișate toate cărțile bibliotecii (vezi figura 7).
III.3.1. Adăugarea unei cărți noi
Pentru a adăuga o carte noua se apasă pe butonul „Adaugă Carte” care va deschide o fereastra dialog pentru a specifica detaliile noi cărți (Vezi figura 8).
Figura 8
După ce au fost făcute modificările dorite se apasă butonul „Salvează”.
III.3.1. Modificare datelor unei cărți existente
Pentru a modifica datele unui cărți existente, trebuie selectata din lista de cărți si se poate apasă butonul „Modifica Detalii Carte” sau se da dublu-click pe cartea respectiva in lista de cărți care va deschide o fereastra dialog cu datele cârtii încărcate (Vezi figura 9).
Figura 9
După ce au fost făcute modificările dorite se apasă butonul „Salvează”.
III.3.1. Ștergerea unei cărți
Pentru a șterge o carte, trebuie selectata in lista de cărți si apoi se poate apasă butonul „Șterge Carte” sau se poate apasă tasta „Delete” de pe tastatura calculatorului si o fereastra-dialog va apărea cerând-va sa confirmați ștergerea cărții (Vezi figura10).
Figura 10
Observații
Daca cartea care se dorește a fi ștearsa este asociata cu cel puțin un membru, ștergerea nu va putea fi făcută. Va trebui dezasociată de la toți membri, după care ștergerea se poate face (vezi figura 11).
Figura 11
III.4. Dulapuri
Figura 12
Acest modul fiind accesat, observam ca butonul „Dulapuri” devine inaccesibil in grupul „Vederi” al meniului din stânga aplicației in timp ce celelalte butoane din acest grup devin accesibile, iar in grupul „Acțiuni” sunt vizibile doar butoanele care au legătura cu acest modul. In gridul „Lista Dulapuri” sunt afișate toate dulapurile bibliotecii (vezi figura 12). In gridul „Detalii Dulap” este afișat dulapul selectat într-un mod ușor interpretabil pentru utilizator. Se pot vedea numărul de rafturi si numărul de locații orizontale, de asemenea se poate observa care locații sunt disponibile si care sunt. La selectarea altui dulap lista de dulapuri se va actualiza in funcție de detaliile dulapului selectat.
III.4.1. Adăugarea unui dulap nou
Pentru a adăuga un dulap nou se apasă pe butonul „Adaugă Dulap” care va deschide o fereastra dialog pentru a specifica detaliile noului dulap(Vezi figura 13).
Figura 13
După ce au fost făcute modificările dorite se apasă butonul „Salvează”.
III.4.2. Ștergerea unui dulap
Pentru a șterge un dulap, trebuie selectat in lista de dulapuri si apoi se poate apasă butonul „Șterge Dulap” sau se poate apasă tasta „Delete” de pe tastatura calculatorului si o fereastra-dialog va apărea cerându-va sa confirmați ștergerea cărții (Vezi figura14).
Figura 14
Observații
Daca dulapul care se dorește a fi șters are cel puțin o locație ocupata ștergerea nu va putea fi făcută. Vor trebui mutate toate cărțile din acest dulap într-un alt, după care ștergerea se poate face
(vezi figura 15).
Figura 15
Capitolul IV.
Aplicație baza de date
I acest capitol voi explica felul in care interacționează partea de interfața grafica a aplicației cu baza de date pentru a prelua si introduce datele necesare.
Conectarea interfeței grafice la baza de date se face prin specificarea „string-ului” de conectivitate specificat in fișierul de configurație al aplicației (app.config).
Exemplu:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
</configSections>
<connectionStrings>
<add name="LCM_Base.Properties.Settings.lcm_baseConnectionString"
connectionString="Data Source=(LocalDB)\MSSQLLocalDB; Initial Catalog=lcm_base;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/>
</startup>
</configuration>
In proiectul de dezvoltare a interfeței grafice am adăugat o clasa „Linq to SQL” care se poate folosii pentru a specifica care elemente SQL doresc sa folosesc din baza de date si in ce împrejurări (vezi figura 16).
In toata aplicația folosesc următoarea proprietate pentru a crea conecția la baza de date:
static DataClassesBaseDataContext m_DbConnect;
public static DataClassesBaseDataContext Prop_DbConnect
{
get
{
if (m_DbConnect == null)
m_DbConnect = new DataClassesBaseDataContext();
return m_DbConnect;
}
}
IV.1. Preluarea informațiilor
Procesul de preluare a informațiilor din tabelele bazei de date pornește din partea de interfața unde codul de execuție a unei acțiuni se conectează la baza de date accesând o funcție „table-valued” care returnează un set de date pe care le afișează in tabelul respectiv
Exemplu:
Pentru a afișa toate cărțile bibliotecii, pe încărcarea ferestrei respective se executa următorul cod:
fntGetBooksResultBindingSource.DataSource = ConnectToDB.Prop_DbConnect.fnt_Get_Books();
Din acest cod rezulta ca in baza de date se executa functia “fnt_Get_Books()” care la randul ei contine urmatorul cod:
RETURNS
TABLE
As
RETURN
(select b.BOOK_ID,
b.BOOK_NAME,
b.BOOK_OBS,
b.BOOK_PAGES,
b.BOOK_RELEASE_DATE,
b.COPIES,
b.CONTACT_ID,
b.AUTHOR_CONTACT_ID,
b.INS_DT,
b.UP_DT,
a.AUTHOR_NAME,
r.RACK_NAME,
r.CONTACT_ID as RACK_CONTACT_ID,
rl.RACK_LOCATION_ID,
isnull(rl.RACK_VERTICAL_LOCATION,0) as RACK_VERTICAL_LOCATION,
isnull(rl.RACK_HORIZONTAL_LOCATION,0) as RACK_HORIZONTAL_LOCATION
from TBL_BOOKS as b
left outer join TBL_AUTHORS as a on a.CONTACT_ID = b.AUTHOR_CONTACT_ID
left outer join TBL_RACK_LOCATIONS as rl on rl.RACK_LOCATION_ID = b.RACK_LOCATION_ID
left outer join TBL_RACKS as r on r.RACK_ID = rl.RACK_ID)
Aceasta funcție va returna o tabela virtuala cu un set de date care va fi interpretat de către tabelul căruia ii sunt trimise aceste date si le va afișa într-un mod ușor de înțeles de către utilizator.
In acest mod se preia si datele modulelor „Cărți” si „Dulapuri”
IV.2. Introducerea de noi informații si modificarea informațiilor existente
Procesul de introducere sau modificare a informațiilor din tabelele bazei de date pornește din partea de interfața unde codul de execuție a unei acțiuni se conectează la baza de date accesând o procedura stocata care executa un set de instrucțiuni in baza de date.
Exemplu:
Pentru a șterge o carte din baza de date, pe eventul de click al butonului „Șterge Carte” se executa următorul cod:
ConnectToDB.Prop_DbConnect.sp_Book_Delete(lBookContactId);
Din acest cod rezulta ca in baza de date se executa procedura stocata sp_Book_Delete(lBookContactId) cu nevoia de a specifica un parametru pentru a se indentifica care carte sa se stearga si care la randul ei contine urmatorul cod:
PROCEDURE [dbo].[sp_Book_Delete] (@p_CONTACT_ID bigint)
AS
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblLinkIdTmp table (rack_location_id bigint)
declare @RackLocationId bigint
delete from TBL_BOOKS
output deleted.RACK_LOCATION_ID into @TblLinkIdTmp
where CONTACT_ID = @p_CONTACT_ID
select @RackLocationId = rack_location_id
from @TblLinkIdTmp
update TBL_RACK_LOCATIONS
set IS_USED = 0
where RACK_LOCATION_ID = @RackLocationId
exec sp_Contact_Id_Delete @p_CONTACT_ID
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Pentru a introduce o carte noua in baza de date, pe eventul de click al butonului „Salvează” de pe fereastra „Adaugă Carte Noua” se executa următorul cod:
ConnectToDB.Prop_DbConnect.sp_Book_Insert(dlg.Prop_BookName, dlg.Prop_AuthorId,dlg.Prop_BookPages,dlg.Prop_ReleaseDate, dlg.Prop_BookObs, dlg.Prop_BookCopies, dlg.Prop_RackLocationId;
Din acest cod rezulta ca in baza de date se executa procedura stocata sp_Book_Insert()cu nevoia de a specifica parametrii necesari care reprezinta detaliile carti si care la randul ei contine urmatorul cod:
PROCEDURE [dbo].[sp_Book_Insert]
(
@p_BOOK_NAME nvarchar (50),
@p_AUTHOR_CONTACT_ID bigint,
@p_BOOK_PAGES int,
@p_BOOK_RELEASE_DATE date,
@p_BOOK_OBS nvarchar (4000),
@p_COPIES int,
@p_RACK_LOCATION_ID bigint
)
AS
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblContactIdTmp table (contact_id bigint)
declare @ContactId bigint
declare @TblLinkIdTmp table (link_id bigint)
declare @LinkId bigint
declare @TodayDate datetime = getdate()
–insert the contact and save the contact id
insert into TBL_CONTACTS
(CONTACT_TYPE_ID)
output inserted.CONTACT_ID into @TblContactIdTmp
values (2)
select @ContactId = contact_id from @TblContactIdTmp
–insert the new book and save the book's id
insert into TBL_BOOKS
(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES,BOOK_RELEASE_DATE,BOOK_OBS, COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)
output inserted.BOOK_ID into @TblLinkIdTmp
values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_RELEASE_DATE,@p_BOOK_OBS,@p_COPIES,@ContactId,@TodayDate,@TodayDate,@p_RACK_LOCATION_ID)
select @LinkId = link_id
from @TblLinkIdTmp
update TBL_RACK_LOCATIONS
set IS_USED = 1
where RACK_LOCATION_ID = @p_RACK_LOCATION_ID
exec sp_Contact_Id_Insert @ContactId, @LinkId
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Concluzii
Aplicația in cauza reprezintă un bun manager pentru o biblioteca care nu implica tranzacții financiare.
Pe tot parcursul dezvoltării aplicației, am ținut cont de principiile de programare SOLID pentru o eventuala scalabilitate si transformare ușoare din punct de vedere programatic intr-un manager de locații pentru o cu totul alt gen de activitate precum o garderoba, magazin de închirieri DVD-uri si chiar adăugarea intr-un mod simplu de funcționalități noi precum tranzacții financiare, membri cu statuturi diferite etc.
Referințe
[1] http://en.wikipedia.org/wiki/Library_management#cite_note-Dewey1-3
[2] https://www.devexpress.com/
[3] http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx
Anexe
Preluare membri:
ALTER FUNCTION [dbo].[fnt_Get_Members]()
/*–––––––––––––––––––––––-
* Project: lcm_base
* Function: fnt_Get_Members
* Description: returns the members
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
RETURNS
TABLE
As
RETURN
(select MEMBER_ID,
MEMBER_NAME,
MEMBER_ADDRESS,
MEMBER_DOB,
MEMBER_CNP,
CONTACT_ID,
MEMBER_OBS,
MEMBER_PHONE,
INS_DT,
UP_DT
from TBL_MEMBERS)
Introducere membru nou:
ALTER PROCEDURE [dbo].[sp_Member_Insert]
(
@p_MEMBER_NAME nvarchar (50),
@p_MEMBER_ADDRESS nvarchar (500),
@p_MEMBER_CNP nvarchar (50),
@p_MEMBER_DOB date,
@p_MEMBER_OBS nvarchar (4000),
@p_MEMBER_PHONE nvarchar (50)
)
AS
/*–––––––––––––––––––––––-
* Project: scm_base
* Procedure: sp_Member_Insert
* Description: Inserts a new member into DB
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblContactIdTmp table (contact_id bigint)
declare @ContactId bigint
declare @TblLinkIdTmp table (link_id bigint)
declare @LinkId bigint
declare @TodayDate datetime = getdate()
–insert the contact and save the contact id
insert into TBL_CONTACTS
(CONTACT_TYPE_ID)
output inserted.CONTACT_ID into @TblContactIdTmp
values (1)
select @ContactId = contact_id from @TblContactIdTmp
–insert the new member and save the member's id
insert into TBL_MEMBERS
(MEMBER_NAME,MEMBER_ADDRESS,MEMBER_CNP,MEMBER_DOB,MEMBER_OBS,CONTACT_ID,INS_DT,MEMBER_PHONE)
output inserted.MEMBER_ID into @TblLinkIdTmp
values (@p_MEMBER_NAME,@p_MEMBER_ADDRESS,@p_MEMBER_CNP,@p_MEMBER_DOB,@p_MEMBER_OBS,@ContactId,@TodayDate,@p_MEMBER_PHONE)
select @LinkId = link_id from @TblLinkIdTmp
exec sp_Contact_Id_Insert @ContactId, @LinkId
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Modificare membru existent:
ALTER PROCEDURE [dbo].[sp_Member_Modify]
(
@p_MEMBER_NAME nvarchar (50),
@p_MEMBER_ADDRESS nvarchar (500),
@p_MEMBER_CNP nvarchar (50),
@p_MEMBER_DOB date,
@p_MEMBER_OBS nvarchar (4000),
@p_MEMBER_PHONE nvarchar (50),
@p_MEMBER_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: lcm_base
* Procedure: sp_Member_Modify
* Description: Modifies the details of an existing member
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TodayDate datetime = getdate()
update TBL_MEMBERS
set MEMBER_NAME = @p_MEMBER_NAME,
MEMBER_ADDRESS = @p_MEMBER_ADDRESS,
MEMBER_CNP = @p_MEMBER_CNP,
MEMBER_DOB = @p_MEMBER_DOB,
MEMBER_OBS = @p_MEMBER_OBS,
MEMBER_PHONE = @p_MEMBER_PHONE,
UP_DT = @TodayDate
where MEMBER_ID = @p_MEMBER_ID
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Stergere membru:
ALTER PROCEDURE [dbo].[sp_Member_Delete]
(
@p_CONTACT_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: lcm_base
* Procedure: sp_Member_Delete
* Description: Deletes an existing member
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
delete from TBL_MEMBERS
where CONTACT_ID = @p_CONTACT_ID
exec sp_Contact_Id_Delete @p_CONTACT_ID
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Preluare cărți:
ALTER FUNCTION [dbo].[fnt_Get_Books]()
/*–––––––––––––––––––––––-
* Project: lcm_base
* Function: fnt_Get_Books
* Description: returns the books
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
RETURNS
TABLE
As
RETURN
(select b.BOOK_ID,
b.BOOK_NAME,
b.BOOK_OBS,
b.BOOK_PAGES,
b.BOOK_RELEASE_DATE,
b.COPIES,
b.CONTACT_ID,
b.AUTHOR_CONTACT_ID,
b.INS_DT,
b.UP_DT,
a.AUTHOR_NAME,
r.RACK_NAME,
r.CONTACT_ID as RACK_CONTACT_ID,
rl.RACK_LOCATION_ID,
isnull(rl.RACK_VERTICAL_LOCATION,0) as RACK_VERTICAL_LOCATION,
isnull(rl.RACK_HORIZONTAL_LOCATION,0) as RACK_HORIZONTAL_LOCATION
from TBL_BOOKS as b
left outer join TBL_AUTHORS as a on a.CONTACT_ID = b.AUTHOR_CONTACT_ID
left outer join TBL_RACK_LOCATIONS as rl on rl.RACK_LOCATION_ID = b.RACK_LOCATION_ID
left outer join TBL_RACKS as r on r.RACK_ID = rl.RACK_ID)
Introducere carte noua:
ALTER PROCEDURE [dbo].[sp_Book_Insert]
(
@p_BOOK_NAME nvarchar (50),
@p_AUTHOR_CONTACT_ID bigint,
@p_BOOK_PAGES int,
@p_BOOK_RELEASE_DATE date,
@p_BOOK_OBS nvarchar (4000),
@p_COPIES int,
@p_RACK_LOCATION_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: scm_base
* Procedure: sp_Book_Insert
* Description: Inserts a new book into DB
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblContactIdTmp table (contact_id bigint)
declare @ContactId bigint
declare @TblLinkIdTmp table (link_id bigint)
declare @LinkId bigint
declare @TodayDate datetime = getdate()
–insert the contact and save the contact id
insert into TBL_CONTACTS
(CONTACT_TYPE_ID)
output inserted.CONTACT_ID into @TblContactIdTmp
values (2)
select @ContactId = contact_id from @TblContactIdTmp
–insert the new book and save the book's id
insert into TBL_BOOKS
(BOOK_NAME,AUTHOR_CONTACT_ID,BOOK_PAGES,BOOK_RELEASE_DATE,BOOK_OBS,COPIES,CONTACT_ID,INS_DT,UP_DT,RACK_LOCATION_ID)
output inserted.BOOK_ID into @TblLinkIdTmp
values (@p_BOOK_NAME, @p_AUTHOR_CONTACT_ID, @p_BOOK_PAGES, @p_BOOK_RELEASE_DATE, @p_BOOK_OBS, @p_COPIES, @ContactId, @TodayDate, @TodayDate,@p_RACK_LOCATION_ID)
select @LinkId = link_id
from @TblLinkIdTmp
update TBL_RACK_LOCATIONS
set IS_USED = 1
where RACK_LOCATION_ID = @p_RACK_LOCATION_ID
exec sp_Contact_Id_Insert @ContactId, @LinkId
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Modificare carte existenta:
ALTER PROCEDURE [dbo].[sp_Book_Modify]
(
@p_BOOK_NAME nvarchar (50),
@p_AUTHOR_ID bigint,
@p_BOOK_PAGES int,
@p_BOOK_RELEASE_DATE date,
@p_BOOK_OBS nvarchar (4000),
@p_BOOK_ID bigint,
@p_COPIES int,
@p_RACK_LOCATION_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: lcm_base
* Procedure: sp_Book_Modify
* Description: Modifies the details of an existing book
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblLinkIdTmp table (old_location_id bigint)
declare @OldLocationId bigint
declare @TodayDate datetime = getdate()
update TBL_BOOKS
set BOOK_NAME = @p_BOOK_NAME,
AUTHOR_CONTACT_ID = @p_AUTHOR_ID,
BOOK_PAGES = @p_BOOK_PAGES,
BOOK_RELEASE_DATE = @p_BOOK_RELEASE_DATE,
COPIES = @p_COPIES,
BOOK_OBS = @p_BOOK_OBS,
UP_DT = @TodayDate,
RACK_LOCATION_ID = @p_RACK_LOCATION_ID
output deleted.RACK_LOCATION_ID into @TblLinkIdTmp
where BOOK_ID = @p_BOOK_ID
select @OldLocationId = old_location_id
from @TblLinkIdTmp
update TBL_RACK_LOCATIONS
set IS_USED = 1
where RACK_LOCATION_ID = @p_RACK_LOCATION_ID
–if the book has been moved from one location to another
if @p_RACK_LOCATION_ID != @OldLocationId
begin
update TBL_RACK_LOCATIONS
set IS_USED = 0
where RACK_LOCATION_ID = @OldLocationId
end
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Ștergere carte:
ALTER PROCEDURE [dbo].[sp_Book_Delete]
(
@p_CONTACT_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: lcm_base
* Procedure: sp_Book_Delete
* Description: Deletes an existing book
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblLinkIdTmp table (rack_location_id bigint)
declare @RackLocationId bigint
delete from TBL_BOOKS
output deleted.RACK_LOCATION_ID into @TblLinkIdTmp
where CONTACT_ID = @p_CONTACT_ID
select @RackLocationId = rack_location_id
from @TblLinkIdTmp
update TBL_RACK_LOCATIONS
set IS_USED = 0
where RACK_LOCATION_ID = @RackLocationId
exec sp_Contact_Id_Delete @p_CONTACT_ID
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Preluare dulapuri:
ALTER FUNCTION [dbo].[fnt_Get_Racks]()
/*–––––––––––––––––––––––-
* Project: lcm_base
* Function: fnt_Get_Racks
* Description: returns the racks
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
RETURNS
TABLE
As
RETURN
(select RACK_ID,
RACK_NAME,
RACK_HORIZONTAL_LOCATIONS,
RACK_VERTICAL_LOCATIONS,
RACK_LOCATION,
RACK_OBS,
CONTACT_ID,
INS_DT,
UP_DT
from TBL_RACKS)
Adăugare dulap nou:
ALTER PROCEDURE [dbo].[sp_Rack_Insert]
(
@p_RACK_NAME nvarchar (50),
@p_RACK_LOCATION nvarchar (500),
@p_RACK_VERTICAL_LOCATIONS int,
@p_RACK_HORIZONTAL_LOCATIONS int,
@p_RACK_OBS nvarchar (4000)
)
AS
/*–––––––––––––––––––––––-
* Project: scm_base
* Procedure: sp_Member_Insert
* Description: Inserts a new member into DB
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblContactIdTmp table (contact_id bigint)
declare @ContactId bigint
declare @TblLinkIdTmp table (link_id bigint)
declare @LinkId bigint
declare @TodayDate datetime = getdate()
–insert the contact and save the contact id
insert into TBL_CONTACTS
(CONTACT_TYPE_ID)
output inserted.CONTACT_ID into @TblContactIdTmp
values (4)
select @ContactId = contact_id from @TblContactIdTmp
–insert the new rack and save the rack's id
insert into TBL_RACKS
(CONTACT_ID,RACK_NAME,RACK_HORIZONTAL_LOCATIONS,RACK_VERTICAL_LOCATIONS,RACK_LOCATION,RACK_OBS,INS_DT)
output inserted.RACK_ID into @TblLinkIdTmp
values (@ContactId,@p_RACK_NAME,@p_RACK_HORIZONTAL_LOCATIONS,@p_RACK_VERTICAL_LOCATIONS,@p_RACK_LOCATION,@p_RACK_OBS,@TodayDate)
select @LinkId = link_id from @TblLinkIdTmp
exec sp_Contact_Id_Insert @ContactId, @LinkId
declare @iCntVertical int = 1
declare @iCntHorizontal int = 1
–create each location of this rack
while @iCntVertical <= @p_RACK_VERTICAL_LOCATIONS
begin
while @iCntHorizontal <= @p_RACK_HORIZONTAL_LOCATIONS
begin
insert into TBL_RACK_LOCATIONS
(RACK_ID,RACK_VERTICAL_LOCATION,RACK_HORIZONTAL_LOCATION)
values (@LinkId,@iCntVertical,@iCntHorizontal)
set @iCntHorizontal = @iCntHorizontal + 1
end
set @iCntHorizontal = 1
set @iCntVertical = @iCntVertical + 1
end
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Ștergere dulap existent:
ALTER PROCEDURE [dbo].[sp_Rack_Delete]
(
@p_CONTACT_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: lcm_base
* Procedure: sp_Author_Modify
* Description: Modifies the details of an existing author
* Authors: Emil Filip (ef)
* Generation-Date: 21.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
delete from TBL_RACK_LOCATIONS
where RACK_ID = (select RACK_ID from TBL_RACKS where CONTACT_ID = @p_CONTACT_ID)
delete from TBL_RACKS
where CONTACT_ID = @p_CONTACT_ID
exec sp_Contact_Id_Delete @p_CONTACT_ID
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Preluare autori
ALTER FUNCTION [dbo].[fnt_Get_Authors]()
/*–––––––––––––––––––––––-
* Project: lcm_base
* Function: fnt_Get_Authors
* Description: returns the authors
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
RETURNS
TABLE
As
RETURN
(select AUTHOR_NAME,
AUTHOR_ID,
CONTACT_ID,
INS_DT
from TBL_AUTHORS)
Adăugare autor nou
ALTER PROCEDURE [dbo].[sp_Author_Insert]
(
@p_AUTHOR_NAME nvarchar (50),
@p_CONCTACT_ID bigint out
)
AS
/*–––––––––––––––––––––––-
* Project: scm_base
* Procedure: sp_Author_Insert
* Description: Inserts a new author into DB
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
declare @TblContactIdTmp table (contact_id bigint)
declare @ContactId bigint
declare @TblLinkIdTmp table (link_id bigint)
declare @LinkId bigint
declare @TodayDate datetime = getdate()
–insert the contact and save the contact id
insert into TBL_CONTACTS
(CONTACT_TYPE_ID)
output inserted.CONTACT_ID into @TblContactIdTmp
values (3)
select @ContactId = contact_id from @TblContactIdTmp
set @p_CONCTACT_ID = @ContactId
–insert the new author and save the author's id
insert into TBL_AUTHORS
(AUTHOR_NAME,CONTACT_ID,INS_DT)
output inserted.AUTHOR_ID into @TblLinkIdTmp
values (@p_AUTHOR_NAME,@ContactId,@TodayDate)
select @LinkId = link_id from @TblLinkIdTmp
exec sp_Contact_Id_Insert @ContactId, @LinkId
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Ștergere autor existent
ALTER PROCEDURE [dbo].[sp_Author_Delete]
(
@p_CONTACT_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: lcm_base
* Procedure: sp_Author_Modify
* Description: Modifies the details of an existing author
* Authors: Emil Filip (ef)
* Generation-Date: 01.03.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
delete from TBL_AUTHORS
where CONTACT_ID = @p_CONTACT_ID
exec sp_Contact_Id_Delete @p_CONTACT_ID
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Asociere carte la membru
ALTER PROCEDURE [dbo].[sp_Member_Book_Associate]
(
@p_MEMBER_ID bigint,
@p_BOOK_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: scm_base
* Procedure: sp_Member_Insert
* Description: Associates a book with a member
* Authors: Emil Filip (ef)
* Generation-Date: 25.05.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
–insert the contact and save the contact id
insert into TBL_MEMBER_BOOKS
(MEMBER_ID, BOOK_ID, INS_DT)
values (@p_MEMBER_ID,@p_BOOK_ID, GETDATE())
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Dezasociere carte de la membru
ALTER PROCEDURE [dbo].[sp_Member_Book_Disassociate]
(
@p_MEMBER_BOOK_ID bigint
)
AS
/*–––––––––––––––––––––––-
* Project: scm_base
* Procedure: sp_Member_Book_Disassociate
* Description: Deletes the association between a book and a member
* Authors: Emil Filip (ef)
* Generation-Date: 25.05.2014
* Changes:
*–––––––––––––––––––––––*/
begin try
declare @transOpen int
set @transOpen = 0
if @@TRANCOUNT = 0
begin
set @transOpen = 1
begin transaction
end
–delete the association
delete from TBL_MEMBER_BOOKS
where MEMBER_BOOK_ID = @p_MEMBER_BOOK_ID
commit;
end try
begin CATCH
if @transOpen = 1
rollback;
end CATCH
Verificare daca autorul este in folosință
RETURNS int
AS
/*–––––––––––––––––––––––-
* Project: LCM
* Function: fn_CheckAuthorIsUsed
* Description: Returns 1 if the author has been assigned to at least one book, esle, will return 0
* Parameters: …
* Version: 1.00
* Authors: Emil Filip (ef)
* Generation-Date: 12.05.2015
*–––––––––––––––––––––––*/
BEGIN
declare @Ret int
if(SELECT COUNT(1) FROM TBL_BOOKS WHERE AUTHOR_CONTACT_ID = @p_AUTHOR_CONTACT_ID) > 0
begin
set @Ret = 1
end
else
begin
set @Ret = 0
end
return @Ret
END
Verificare daca dulapul este gol
RETURNS int
AS
/*–––––––––––––––––––––––-
* Project: LCM
* Function: fn_CheckAuthorIsUsed
* Description: Returns 1 if the author has been assigned to at least one book, esle, will return 0
* Version: 1.00
* Authors: Emil Filip (ef)
* Generation-Date: 12.05.2015
*–––––––––––––––––––––––*/
BEGIN
declare @Ret int
if(SELECT COUNT(1) FROM TBL_RACK_LOCATIONS WHERE RACK_ID = @p_RACK_ID and IS_USED = 1) > 0
begin
set @Ret = 1
end
else
begin
set @Ret = 0
end
return @Ret
END
Referințe
[1] http://en.wikipedia.org/wiki/Library_management#cite_note-Dewey1-3
[2] https://www.devexpress.com/
[3] http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Configurarea Bazei de Date Ms Sql Manager de Locatii (ID: 149643)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
