|
www.proxima-soft.sk Px Framework - ASP.NET komponenty pre rýchly vývoj databázových aplikácii
|
Zobrazi predchádzajúcu tému :: Zobrazi nasledujúcu tému |
Autor |
Správa |
Ján F.
Založený: utorok, 20 júla 2010, 00:00 Príspevky: 31 Bydlisko: B.Bystrica
|
Zaslal: pondelok, 2 augusta 2010, 13:06 Predmet: Vkladanie nového riadku??? |
|
|
Po zapojeni komponent PxWebQuery a PxSuperGrid, sa mi nedal vytvoriť nový riadok? Funkcie, ako editacia a mazanie fungovali.
|
|
Návrat hore |
|
|
admin
Založený: štvrtok, 17 júna 2010, 00:00 Príspevky: 49 Bydlisko: Fatranská 1, B.Bystrica
|
|
Návrat hore |
|
|
Ján F.
Založený: utorok, 20 júla 2010, 00:00 Príspevky: 31 Bydlisko: B.Bystrica
|
Zaslal: pondelok, 2 augusta 2010, 13:22 Predmet: Vkladanie nového riadku??? |
|
|
Pri databáze Mysql, sa tato sequencia vytvára inak ???
|
|
Návrat hore |
|
|
admin
Založený: štvrtok, 17 júna 2010, 00:00 Príspevky: 49 Bydlisko: Fatranská 1, B.Bystrica
|
Zaslal: pondelok, 2 augusta 2010, 14:49 Predmet: Vytvorenie sequencie / generátora pre MySQL server |
|
|
Na to aby ste prostredníctvom PxWebQuery vkladali nove riadky, potrebujete vytvoriť sequenciu, z ktorej si komponenta PxWebQuery načíta jedinečné ID pre svoj primárny kľúč. Mysql Server sequencie nepodporuje, preto bolo zvolené riešenie, ktoré tieto sequencie nahradzuje. Teda ak chcete pracovať s Px Frameworkom pod databázou Mysql, musíte si vytvoriť sequenciu nasledujúcim spôsobom. Túto sequenciu si vytvoríte dvoma nasledujúcimi krokmi.
1. Vytvorenie tabuľky, kde sa odkladá posledná načítaná hodnota pre každú tabuľku 2. Vytvorenie procedúry, ktorá bude manažovať, načítanie a inkrementovanie hodnoty daného riadka tabuľky
Aby nám fungovalo aj vkladanie dát do databázy, vytvoríme SQL príkazom najprv tabuľku a potom procedúru. Názov tabuľky a procedúry musí zostať nezmenení. Tabuľku pre generovanie sequencie, vytvoríte zadaním nasledujúceho SQL príkazu:
kód: | --VYTVORENIE TABULKY PRE SEQUENCIU, --GENEROVANIE NOVEHO ID PRE MYSQL create table All_Sequence( seq_name varchar(30), start int, increment int, currval int, flag char(1)); |
Vytvorenie procedúry, ktorú využíva Px Framework na načítanie jedinečnej hodnoty kľúča pre danú tabuľku, vytvoríte zadaním nasledujúceho SQL príkazu:
kód: | --VYTVORENIE PROCEDURY SEQUENCIE CREATE DEFINER = 'root'@'localhost' PROCEDURE Get_Sequence( in SeqName varchar(255), out NextVal int ) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' begin declare rowcount int; declare v_flag char(1); select Count(*) into rowcount from All_Sequence where seq_name=SeqName; if rowcount=0 then insert into All_Sequence values(SeqName,1,1,1,'A'); set NextVal = 1; else set v_flag='N'; while (v_flag='N') do select flag into v_flag from All_Sequence where seq_name=SeqName; end while; update All_Sequence set flag='N' where seq_name=SeqName; select currval+INCREMENT into NextVal from All_Sequence where seq_name=SeqName; update All_Sequence set flag='A',currval=NextVal where seq_name=SeqName; end if; end; |
Do sekcie "CREATE DEFINER" procedúry, treba ešte zmeniť meno užívateľa a meno hostu na ktorom beží MySQL databáza, v našom prípade to je "'root'@'localhost'". Hore uvedená procedúra sa dala skompilovať bez chyby na servery MySQL verzia 5.1.. Pokiaľ, by nám neprešla kompilácia hore uvedenej procedúry, ďalej uvádzam upravenú procedúru, ktorá by mala zbehnúť na MySQL servery verzia 5.0.. a nižšej verzii, tu sú doplnené definície delimiterov.
kód: | DELIMITER $$ CREATE DEFINER = 'root'@'localhost' PROCEDURE Get_Sequence( in SeqName varchar(255), out NextVal int ) NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER COMMENT '' begin declare rowcount int; declare v_flag char(1); select Count(*) into rowcount from All_Sequence where seq_name=SeqName; if rowcount=0 then insert into All_Sequence values(SeqName,1,1,1,'A'); set NextVal = 1; else set v_flag='N'; while (v_flag='N') do select flag into v_flag from All_Sequence where seq_name=SeqName; end while; update All_Sequence set flag='N' where seq_name=SeqName; select currval+INCREMENT into NextVal from All_Sequence where seq_name=SeqName; update All_Sequence set flag='A',currval=NextVal where seq_name=SeqName; end if; end$$ DELIMITER ; |
Hneď po vytvorení tabuľky a procedúry, môžeme začať pracovať s Px Frameworkom a vkladať nové riadky. Pokiaľ pre dané ID tabuľky, nebol v tabuľke All_Sequence vytvorení riadok, tak tento riadok sa automaticky vytvorí pri jej prvom zavolaní. Pri každom ďalšom zavolaní sa inkrementuje o hodnotu 1 smerom hore alebo o hodnotu Increment, zadanú v tabuľke All_Sequence.
|
|
Návrat hore |
|
|
Ján F.
Založený: utorok, 20 júla 2010, 00:00 Príspevky: 31 Bydlisko: B.Bystrica
|
Zaslal: pondelok, 9 augusta 2010, 12:22 Predmet: Vkladanie nového riadku??? |
|
|
A ako je to pri platforme MS SQL???
|
|
Návrat hore |
|
|
admin
Založený: štvrtok, 17 júna 2010, 00:00 Príspevky: 49 Bydlisko: Fatranská 1, B.Bystrica
|
Zaslal: pondelok, 16 augusta 2010, 12:30 Predmet: Vkladanie nového riadku??? |
|
|
MS SQL Server sequencie nepodporuje, preto bolo zvolené riešenie, ktoré tieto sequencie nahradzuje. Teda ak chcete pracovať s Px Frameworkom pod databázou MS SQL, musíte si vytvoriť sequenciu nasledujúcim spôsobom. Túto sequenciu si vytvoríte dvoma nasledujúcimi krokmi.
1. Vytvorenie tabuľky, kde sa odkladá posledná načítaná hodnota pre každú tabuľku 2. Vytvorenie procedúry, ktorá bude manažovať, načítanie a inkrementovanie hodnoty daného riadka tabuľky
Aby nám fungovalo aj vkladanie dát do databázy, vytvoríme SQL príkazom najprv tabuľku a potom procedúru. Názov tabuľky a procedúry musí zostať nezmenení. Tabuľku pre generovanie sequencie, vytvoríte zadaním nasledujúceho SQL príkazu:
kód: | --VYTVORENIE TABULKY, KDE SA BUDU UKLADAT HODNOTY SEQUENCII Create table All_Sequences ( SeqName nvarchar(255) primary key, -- name of the sequence Start int not null default(1), -- seed value Increment int not null default(1), -- incremental CurrVal int ) GO |
Vytvorenie procedúry, ktorú využíva Px Framework na načítanie jedinečnej hodnoty kľúča pre danú tabuľku, vytvoríte zadaním nasledujúceho SQL príkazu:
kód: | --PROCEDURA NA NACITANIE SEQUENCIE create procedure Get_Seguence @SeqName nvarchar(255), @result int OUTPUT, @start int = 1, @incr int = 1, @currvalue int = 1 as begin declare @NewSeqVal int set NOCOUNT ON update All_Sequences set @NewSeqVal = CurrVal = CurrVal+Increment where SeqName = @SeqName if @@rowcount = 0 begin if exists ( select 1 from All_Sequences where SeqName = @SeqName ) begin print 'Sequence already exists.' return 1 end if @start is null set @start = 1 if @incr is null set @incr = 1 set @currvalue = @start insert into All_Sequences (SeqName, Start, Increment, CurrVal) values (@SeqName, @start, @incr, @currvalue) set @result = @currvalue RETURN end set @result = @NewSeqVal return end GO
|
Hneď po vytvorení tabuľky a procedúry, môžeme začať pracovať s Px Frameworkom a vkladať nové riadky. Pokiaľ pre dané ID tabuľky, nebol v tabuľke All_Sequences vytvorení riadok, tak tento riadok sa automaticky vytvorí pri jej prvom zavolaní. Pri každom ďalšom zavolaní sa inkrementuje o hodnotu 1 smerom hore alebo o hodnotu Increment, zadanú v tabuľke All_Sequences.
|
|
Návrat hore |
|
|
Ján F.
Založený: utorok, 20 júla 2010, 00:00 Príspevky: 31 Bydlisko: B.Bystrica
|
Zaslal: utorok, 17 augusta 2010, 11:54 Predmet: FireBird / Interbase??? |
|
|
A ako je to pri platforme FireBird / Interbase???
|
|
Návrat hore |
|
|
admin
Založený: štvrtok, 17 júna 2010, 00:00 Príspevky: 49 Bydlisko: Fatranská 1, B.Bystrica
|
Zaslal: streda, 18 augusta 2010, 13:19 Predmet: Vkladanie nového riadku??? |
|
|
Na to aby ste prostredníctvom PxWebQuery vkladali nove riadky do databazy Firebird / Interbase, potrebujete vytvoriť generátor, z ktorej si komponenta PxWebQuery načíta jedinečné ID pre svoj primárny kľúč. Názov generátora, by ste mali vytvoriť nasledujúcim spôsobom.
kód: | SEQ_"názov stĺpca primárneho kľúča" |
Preto, keď tvoríte nové tabuľky nedávajte názov stĺpcu s primárnym kľúčom len "ID", ale napríklad ID+"názov tabuľky". V našom príklade, aby nám fungovalo aj vkladanie dát do databázy, vytvoríme generátor SQL príkazom:
kód: | CREATE GENERATOR "SEQ_IDADRESAR"; |
Pokiaľ pracujete aj s diakritikou, je potrebné pod serverom Interbase do ConnectionStringu zadať aj character set, pretože provider pre Interbase, dodávaný s Px Frameworkom, vyhadzuje chybovú hlášku pri zadaní diakritiky, a nezadefinovaní tejto znakovej sady do prihlasovacieho reťazca.
kód: | character set=WIN1250; |
Výsledný ConnectionString bude vyzerať nasledovne:
kód: | wquAdresar.ConnectString = "DataSource = localhost;Database=C:\\WINNT\\DATA27.GDB;UserID = SYSDBA;Password = masterkey;character set=WIN1250;"; |
|
|
Návrat hore |
|
|
|