|
![]() | Programovßnφ v externφch jazycφch | Kontextovß prom∞nnß klienta | ![]() |
Zde popisujeme postup p°ipojenφ se klienta na SQL server a odpojenφ se.
Pro MFC jsou kádispozici t°φdy a pro Delphi komponenty, odvßd∞jφcφ tuto inicializaΦnφ a deinicializaΦnφ prßci (nebo jejφ Φßst) po₧adovan²m zp∙sobem. Jich lze vyu₧φt pro zjednoduÜenφ prßce.
Ka₧d² klient, kter² se chce p°ipojit na databßzov² server 602SQL, musφ mφt tzv. kontextovou prom∞nnou cd typu cd_t pro pr∙b∞₧nΘ ulo₧enφ informacφ o kontextu komunikace.
Klient musφ:
Alokujete-li prom∞nnou cd ve vlastnφ sprßv∞ pam∞ti, m∙₧ete zjistit jejφ pot°ebnou velikost volßnφm funkce cdp_size.
Klient se m∙₧e souΦasn∞ p°ipojit na vφce server∙ nebo si vytvo°it vφcenßsobnΘ spojenφ na stejn² server. VátakovΘm p°φpad∞ musφ mφt vφce kontextov²ch prom∞nn²ch. Vφce paralelnφch spojenφ klienta na server vÜak znemo₧≥uje pou₧φvat nßstroje u₧ivatelskΘho rozhranφ zabudovanΘ do 602SQL.
Klientsk² program mß kádispozici dv∞ sady funkcφ pro komunikaci se serverem. Funkce, zaΦφnajφcφ prefixem cd_ majφ oproti funkcφm bez tohoto prefixu jeden parametr navφc - prvnφm parametrem je kontextovß prom∞nnß cd resp. ukazatel na ni.
Funkce sáprefixem cd_ je nutno pou₧φvat tehdy, pokud spojenφ na server vytvo°φ jedno vlßkno a pou₧φvß je jinΘ, nebo pokud souΦasn∞ existuje vφce paralelnφch spojenφ na servery. Pokud klient mß pouze jedno vlßkno p°ipojenΘ na jedin² server, ale pou₧φvat ob∞ sady funkcφ se stejn²m efektem.
Pokud ka₧dΘ vlßkno klienta komunikuje s databßzφ pouze prost°ednictvφm spojenφ, kterΘ si samo vytvo°ilo, a pou₧φvß funkce s prefixem cd_, pak rozhranφ na server funguje reentrantn∞ a Φinnost vlßken nenφ nutno na klientskΘ stran∞ nijak synchronizovat. Pokud vlßkna budou souΦasn∞ pracovat se stejn²mi daty, je t°eba poΦφtat s mo₧nostφ deadlocku na serveru.
Pokud klient mß vφce vlßken a vlßkno m∙₧e vyu₧φvat spojenφ vytvo°enΘ jin²m vlßknem, pak:
Jin²mi slovy vlßkno, kterΘ chce pracovat s databßzφ, si vybere spojenφ a provede na n∞j funkci cd_assign_to_thread. Pak m∙₧e pracovat a po skonΦenφ prßce zavolß cd_unassign. Po tuto dobu spojenφ nesmφ b²t p°i°azeno ₧ßdnΘmu jinΘmu vlßknu ani vyu₧φvßno ₧ßdn²m jin²m vlßknem.
Ka₧d² klient musφ zvolit server, sánφm₧ bude komunikovat. Vybrat si lze pouze zátakov²ch server∙, kterΘ jsou zaregistrovßny na poΦφtaΦi, na n∞m₧ b∞₧φ klient, nebo kterΘ b∞₧φ ze stejnΘm segmentu sφt∞ (pro TCP/IP pouze je-li u klienta povolen broadcasting).
P°ipojenφ klienta na zvolen² server provßdφ funkce cd_connect se jmΘnem serveru p°edan²m jako parametr. Tato funkce zjistφ, zda po₧adovan² server b∞₧φ lokßln∞ nebo vásφti. Pokud server neb∞₧φ a je znßma cesta kájeho databßzovΘmu souboru, pak je server lokßln∞ spuÜt∞n.
Pokud server b∞₧φ lokßln∞, preferuje se pod Windows p°φmΘ p°ipojenφ klienta bez podpory sφt∞. Chcete-li se p°ipojit po sφti i na lokßln∞ b∞₧φcφ server (nap°. kv∙li testovßnφ sφ¥ovΘho chovßnφ), musφte p°ed jmΘnem serveru váparametru funkce cd_connect uvΘst hv∞zdiΦku.
Zprßvu o p°φpadnΘ chyb∞ p°i provßd∞nφ funkce cd_connect lze zobrazit vádialogovΘm okn∞ pomocφ procedury Kernel_error_box.
Klient se odpojφ od serveru zavolßnφm funkce cd_disconnect. Tato funkce musφ b²t zavolßna p°ed ukonΦenφm prßce klienta a p°ed p°φpadnou dealokacφ prom∞nnΘ cd.
Klient se na server p°ihlaÜuje pod urΦit²m u₧ivatelsk²m jmΘnem. Server m∙₧e povolit takΘ anonymnφ p°φstup, k n∞mu vÜak obvykle p°φsluÜφ velmi omezenß prßva.
K p°ihlßÜenφ se slou₧φ funkce (cd_)Login. Parametry tΘto funkce jsou jmΘno u₧ivatele a heslo. Server prov∞°φ, zda u₧ivatele mß váseznamu a zda souhlasφ heslo. Pokud je vÜe vápo°ßdku, je p°ihlßÜenφ se klienta na server provedeno.
Funkci (cd_)Login lze zavolat a₧ po ·sp∞ÜnΘm provedenφ funkce cd_connect. Interaktivnφ variantou funkce (cd_)Login je funkce (cd_)Alogin.
Klient p°ihlßÜen² na server m∙₧e svΘ u₧ivatelskΘ jmΘno zjistit pomocφ funkce (cd_)Who_am_I.
Opakem p°ihlßÜenφ se na server je odhlßÜenφ, kterΘ provede funkce (cd_)Logout. Po odhlßÜenφ se klient stßvß anonymnφm a m∙₧e se pozd∞ji p°ihlßsit pod jin²m jmΘnem.
AplikaΦnφ program m∙₧e u₧ivateli umo₧nit odhlßsit se a pozd∞ji se znovu p°ihlßsit, pokud u₧ivatel odchßzφ od poΦφtaΦe a nechce, aby n∞kdo zneu₧il jeho prßv.
Funkce (cd_)Login a (cd_)Logout se musφ volat mezi volßnφm funkcφ cd_connect a cd_disconnect.Klient by m∞l zvolit databßzovΘ schΘma, v n∞m₧ se nachßzejφ objekty, s nimi₧ hodlß pracovat. Na objekty ve zvolenΘm schΘmatu pak m∙₧e odkazovat pouze jejich jmΘnem, zatφmco na objekty z jin²ch schΘmat musφ odkazovat slo₧it∞jÜφm zßpisem ve tvaru:
jmΘno_schΘmatu.jmΘno_objektu
SchΘma lze zvolit volßnφm funkce (cd_)Set_application.
NovΘ schΘma lze vytvo°it pomocφ funkce (cd_)Insert_object nebo pomocφ SQL p°φkazu CREATE SCHEMA.
AplikaΦnφ program napsan² váexternφm jazyce m∙₧e nastavit jako projekt program vytvo°en² ve vnit°nφm jazyce a umφst∞n² veázvolenΘm schΘmatu. Tφm zφskß mo₧nost pracovat sáprom∞nn²mi tohoto projektu, provßd∞t p°φkazy vákontextu projektu, otevφrat objekty (formulß°e, menu, dotazy, sestavy) vyu₧φvajφcφ deklarace záprojektu a pou₧φvat váSQL p°φkazech hostitelskΘ prom∞nnΘ.
Nastavenφ projektu se provede volßnφm funkce (cd_)Open_project. Ke konkrΘtnφ prom∞nnΘ záprojektu lze p°istoupit p°es jejφ adresu zφskanou od funkce (cd_)Get_var_address. ProvΘst zadanou posloupnost p°φkaz∙ vnit°nφho programovacφho jazyka vákontextu projektu umo₧≥uje funkce (cd_)Exec_statements.
Komunikace klienta s databßzov²m serverem musφ b²t uzav°ena do slupky funkcφ v tomto po°adφ:
uses winbase; var my_cd:cd_t; //kontextova promenna klienta err:integer; //klient se pripojil logged:boolean; //klient je uspesne prihlaseny procedure TForm1.FormCreate(Sender: TObject); begin cdp_init(@my_cd); //inicializace kontext. promenne klienta err:=cd_connect(@my_cd, 'test', sw_minimize); //propojeni klienta k serveru test //server test musi byt zaregistrovany (instalace wb602) if err=KSE_OK then begin logged:=not cd_Login(@my_cd,'',''); //prihlaseni se k serveru cd_Set_application(@my_cd, 'testap'); //nastaveni schematu end; end; procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction); begin if err=KSE_OK then //pokud bylo pripojeno cd_disconnect(@my_cd); //ukonceni prace a odhlaseni od 602SQL, ukonceni spojeni end;
![]() | Programovßnφ v externφch jazycφch | Kontextovß prom∞nnß klienta | ![]() |