Binding Boolean fields from Firebird
From time to time there’s a question about binding bool fields from Firebird into DataSet/DataTable. Because Firebird has no bool datatype people created a lot of workarounds. The most used way is to use CHAR(1) or SMALLINT as base type (or domain with check constraint). With integer, there’s no problem. When you have 0/1 False/True it’s trivial. But how to do this with char (or any other way you’re using). Well, the solution is easy. I like this one.
I create select, that returns true/false as 1/0 directly. Using CASE statement is really helpful. This solution has minimal overhead and can be used with any datatype you’re using as bool. For fine-tunning you can create a view or stored procedure (for select or only for returning 0/1 values from your type).
IMO this solution pretty easy and straightforward. You can use it with Fb… objects directly or with DDEX generated without any problem.



There's 33 Comments So Far
July 2nd, 2007 at 18:40
A nebylo by lepsi zavest datovy typ pro boolean
? A pri te prilezitosti i pro uniqueidentifier.
July 2nd, 2007 at 18:44
A proc? SmallInt, Char(1), … to jisti.
Nevidim v tom zadny problem, ze nemam bool. Je to velice trivialni simulovat a muzu si udelat i 4-stavovou logiku.
Jinak pokud uniqueidentifier myslis GUID aspol., tak muzes pouzit VarChar a Octets. Jednoduchy, rychly. Pouzivam k plne spokojenosti.
July 4th, 2007 at 13:26
Samozrejme ze to není velký problém, asi tak stejně jako nemusím mít datové typy integer, bigint atd, vzdyt to staci narvat do varcharu.
Nevím jak u Vás ale v mém kodu se rozhodovani zda je to pravda / nepravda docela hemží, a kvůli vlastnosti musím zbytečně psát kod navíc…. Pokud bych přijal vaši logiku tak nepotřebuji ani CheckBox …, Co mi na Firebirdu vadí je absence typu Bool (FibPlus to zaplatbůh nějak řeší interně) a nemožnost použití doménových jmen v stored procedure (ve verzi 2.1 to už prý jde). Jinak jsem se chtěl zeptat jak používáte Guid ?
July 6th, 2007 at 20:57
ad int> kdepak, pak by se s tim nedaly delat aritmeticke operace.ad SP> ano, ve FB2.1 je jiste posun k tomutoad GUID> jak jsem napsal, varchar a octets. Zadny problem.
July 8th, 2007 at 13:44
After Binding Boolean fields from Firebird post few days ago I got some comments about GUID values in
July 9th, 2007 at 07:09
Samozřejmě že to používání varcharu jsem myslel v nadsázce, ale když musím nyní přetypovávat NejakyTyp na BOOL tak pro potřebu aritmetických operací lze přetypovat i varchar (opět tak trochu nadsázka). Jen jsem chtěl poukázat na to že argumetace tohoto typu není dle mého názoru zrovna ideální.Kdyby to totiž byl typ Bool tak nepotřebný , proč by v ostatních SQL databázích existoval- a proč by vlastně tedy existoval?.A abych používal vícestavé hodnoty není určen BOOL ale na příklad INTEGER kerý lze využít i pro více než 4 stavový režim … Jen mě mrzí že ani v FB 3 se s ním nepočítá
July 9th, 2007 at 09:09
To ze lze pretypovat varchar je sice nadsazka, ale je to spatne. Na co pretypuju varchar, kdyz nebudu mit int nebo obecne cislo? Int je treba prave kvuli pocitani.Nicmene bool je interne stejne cislo, takze to jde (sice to neni user-friendly, ale jde). Bool ve FB/IB nikdy nebyl. Je to takove specifikum.
Kazdy si na to zvykl a kazdy nasel zpusob, jak s tim pracovat, jako by tam byl.
July 10th, 2007 at 06:22
Sorry, ale kdyby si na to každý zvyknul tak tato a spoustu dalších debat nebude existovat. P.S. Končím na toto téma. Z mé strany již není co přínosného dodat.
July 11th, 2007 at 17:52
taky mě štve že firebird nemá Boolean a Guid – snad by se už tvůrci Firebirdu mohli zamyslet a přestat nutit tisíce uživatelů vymýšlet opičárny jak tento nedostatek obcházet. To samé je autoinkrement – už se konečně probuďte – píše se rok 2007 a to co bylo snesitelné v době kdy vznikla interbase je dnes na hraně použitelnosti
July 11th, 2007 at 18:14
Autoincrement ve FB je. Pomoci generatoru (sekvenci). Podobny princip ma napr. oracle, postgres, … Takze toto svedci jen o vasi neznalosti.Ke guid jste se jiz vyjadril vedle, takze tam (http://blog.cincura.net/id/225946/)…
July 11th, 2007 at 19:07
autoincrement je neco, od ceho se upousti a nahrazuje se to prave sekvencemi… GUID nemá žádnou valnou výhodu v přímé implementaci, podstatné je jeho generování a indexace – to jde i pomocí standardních prostředků.
July 11th, 2007 at 19:10
a ad bool – prave ze jej skoro zadne platformy primo neimplementujia pokud, tak malokdy souhrnne (k sobe), zpravidla jako implementaci sintu. Nerikam, ze neni potrebny, muze byt, ale neni to takova katastrofa, kdyz neni.
July 11th, 2007 at 19:14
Autoincrement ve FB NENÍ – a to že tam není se řeší pomocí generátoru.
July 11th, 2007 at 19:29
Ano striktne vzato autoincrement tam neni. Ale prave generator/sekvence toto resi. Resi se to tak na ORA, PG, … Nic divneho.
July 11th, 2007 at 19:32
AI je nešťastný typ – neumožňuje to, co sekvence. Čili pomolcí sekvence jde AI zcela bez problémů, to co jde pomocí sekvence, pomocí AI nejde…
July 11th, 2007 at 20:05
pro mě je guid užitečný – například před nějakým časem jsem několik hodin ladil program než jsem zjistil že na jednom místě byla chyba v konverzi guidu na string – guid se převedl na string v jiném formátu. Kdyby firebird podporoval guid tak bych nemusel před uložením dělat konverzi na string a to by mě ušetřilo spoustu času a nervů.
July 11th, 2007 at 20:22
to same je Autoincremenet versus generator – ano muzete nahradit autoincrement generatorem ale potrebujete na to vice kodu, vice casu a je vetsi pravdepodobnost ze někde uděláte chybu. Jo a take by me zajimalo kdyz potrebujete vytvaret docasne tabulky s autoincrementem tak to asi nebude to prave orechove pro kazdou docasnou tabulku vytvaret novy generator co ?
July 11th, 2007 at 21:24
* proc bych pro docasne tabulky musel vytvatret x generatoru. Staci mi jeden. V tom neni zadny problem. Vice kodu? Jo, malinko – ale bez problemu mohu resetovat sekvenci, nacitat si hodnoty dopredu apod. * konverze GUID – string – proboha, v cem ze byla chyba? V konverzi cisla v hexa tvaru spomlckami na string? Nebo v bitovem tvaru? Pokud ti to usetrilo spoustu casu anervu je otazkou, zda vis, co v db delas (sorry za tu invektivu, ale vidim to tak)Nema cenu dlouze diskutovat nad necim, co historie a pouzitelnost ukazala, ze je prezite. GUID jako specialni datovy typ neni dulezity, autoinkrement je neco, od ceho se ustupuje prave ke generatorum… A na okraj – jaka platforma ti vlastne vyhovuje?:-)
July 11th, 2007 at 21:49
S tim GUID to taky nechapu. To co pisete je jako kdyz chcete, aby DB mela kde-co a omezovala moznost chyby *vyvojare*, ale to neni cesta. Pak muzeme mit self-developing IDE a bude (nadsazka)…Generator je prace navic, ale je to neco za neco. Jasny napsat “id int primary key autoincrement” je jednoduche. Naproti tomu se sekvenci je to vytvorit sekvenci; udelat trigger. Tedy nejaka prace navic – ja na to mam sablonu a jen zmenim nazvy a kopiruju
. Ale zase muzu lehce udelat veci co s autoincremenem ne (obecne sekvence je nadmnozina autoincrementu). Avsak to je na jinou debatu.
July 11th, 2007 at 22:09
je to jednoduchy – vyhrava ten kdo na stejnou vec potrebuje napsat mene radku kodu – tak to proste funguje v trzni ekonomice. Proc bych mel ztracet cas konverzema guidu na string a proc bych mel vytvaret triggery kdyz je zrovna nepotrebuju ? Jde o to jak za co nejmene casu vytvorit co nejvice prace – sorry ale jestli tohle nekdo nechape tak pak uz nevim jak to jinak vysvetlit.
July 12th, 2007 at 10:39
Ale ten, kdo to nevysvetlil, jsi Pavle ty… Nejmene casu? Kolik DDL operaci zabere vyvoj? 1 promile? Kolik z toho trigger, ktery si stejne z modleu nechas vygenerovat automaticky? Dalsi promile z promile… Ne, o tom efektivita vyvoje opravdu neni… Sorry, nechci byt zly, ale prijde mi, ze se teoreticky drzsich sve viry bez jakehokoli argumentu. Ale mne to muze byt fuk, ja proste jen nesouhlasim a vysvetlil jsem proc:)
July 12th, 2007 at 10:42
2 Jirka – Jirko, ta prace navic – vzdyt je to zcela zanedbatelne. Kolik to trva? Pet vterin a ikdyz to budu psat rucne? Deset vterin? Pul minuty? Kolikrat ve schematu bezne velikosti to je? 20x? 10 minut “ztrata”? Kolik oproti tomu ztratim casu a nervu s resetovanim AI (sam vis, jak casto je to opakovana otazka v diskuzich). Den? Dva?
July 12th, 2007 at 14:47
2Marek Kocan> No kdyz mam par tabulek delam to rucne. Takze to prudi s tim, ze si to musim zkopirovat. Ale je to fakt par minut navic. Velky generuju z nejakeho case-nastroje a tam je mi to fuk.
July 14th, 2007 at 11:13
jde o to ze kdyz musite neco udelat 100x stejne tak vam garantuju ze na 101 se urcite spletete protoze clovek neni stroj – a pak muzete nekolik hodin ladit program nez prijdete na to kde jste udelal chybu. Proto je takova snaha psat programy s co nejmensim poctem radku – cim mene kodu tim mensi pravdepodobnost chyby. Vase tvrzeni “par minut navic” je nesmysl tak se to proste neda pocitat už proto že složitost programu neroste lineárne s počtem řádků kodu.
July 14th, 2007 at 11:25
Kdyz budu mit 100 tabulek, generuju to z case nastroje. Zadny problem. Asi nema cenu disktutovat nad necim, kdyz nehodite do placu nejaky argument pro sva tvrzeni (sorry, ale je to tak).
July 14th, 2007 at 11:26
na firebirdu me taky vadi pochybny backup/restore. U jednoho sveho programu pouzivam databazi o velikosti cca 8 GB a restore teto databaze trva vice jak 12 hodin !!! – teda alespon myslim protoze jsem to po 12 hodinach vypnul. Nedej boze aby se neco stalo abych to restore doopravdy potreboval.
July 14th, 2007 at 15:27
Pokud backup trva dlouho, je mozne, ze je neco spatne. Moznosti je plno.Skoc na Firebird(CZ): http://groups.google.com/group/firebird_cz + pridat nejake info. Urcite se neco najde.BTW nbackup taky trva tak dlouho?
July 14th, 2007 at 20:20
pouzivam verzi 1.5.4 takze nevim jak nbackup
July 14th, 2007 at 20:22
Tady to nema smysl resit. Firebird(CZ) je spravne misto.
July 14th, 2007 at 22:38
2 Pavel – souhlasím s Jirkou, nemá cenu to řešit2 Pavel – no, tak asi děláte něco špatně či máte neodpovídající HW… běžně restore dnes cca 35 GB databáze zvládáme na cca 5 let starém HW okolo tří hodin. Ale souhlas, i to se mi zdá hodně pomalé:-))))
July 17th, 2007 at 23:47
neverim – bavime se o verzi 1.5.4 ? zkuste si to otestovat a uvidite
Who Linked To This Post?
Share your thoughts, leave a comment!