
Nezobrazujúce sa záznamy databázy spojenej cez ADO v Delphi 2007
Mám databázu, ku ktorej som v Delphi 2007 pripojený cez ADO komponenty. V komponente DBGrid, ktorá má zobrazovať dáta z databázy v prehľadnej tabuľke, sa mi zobrazujú iba názvy stĺpcov tabuľky (načítali sa z databázy). No políčka, kde majú byť už konkrétne údaje záznamov, sú prázdne. Neviete mi niekto poradiť v čom je problém? Inak to isté robia aj ostatné komponenty, ktoré majú zobrazovať dáta z databázy.
Teraz mi zas vypisuje chybu 'Cannot convert 1857 to a date' v tomto riadku:
Ten je súčasťou nasledujúcej časti zdrojového kódu:
To je jak u blbejch. Kdyz ti poradim, abys datum daval ve formau yyyymmdd, ty mi odpovis, ze uz to davno davas jako date a pak uvedes ukazku kodu, kde mas nekolikrat:
Tobe jina databaze nepomuze. Bohuzel jedine, co ti pomuze je rozumet tomu, co pises.
A muzes se samozrejme spolehat na pirazovani variantu a jejich "nejakou" konverzi, ale nemas zadnou kontrolu nad typy.
Pred par prispevky jsem ti psal, jak nastavit typ parametru. Zkus si to precist.
Sorry, som myslel, že v tomto prípade to nič neovplyvní. Inak díky za upozornenie, dal som tam yyyymmdd a už nevypisuje tú chybu. Teraz to zas hlási 'CommandText does not return a result set.'.
Inak tá procedúra v databáze, ktorá je aj v tom kúsku zdrojáku, pridáva do databázy nový záznam. A ten záznam sa už pod WinXP zobrazil, až na tie dve položky Stav a Pohladavky, ktoré tá procedúra prijíma ako parametre. Asi som tam dal zlý dátový typ. Ale čo tam mám dať, aby to bolo kompatibilné, keď v databáze sú dátové typy decimal (10,0) a decimal (10,2)? Ako DataType oboch parametrov tam databáza dohodí ftBCD, no čo mám dať ako Value.Type?
A ty se divis, proc ti to tu chybu pise?
Opakuji. Sam nevis co pises.
Doporucuji se zamerit na DataModule1.ADOStoredProc.ExecProc;
V helpu si najdi, co udela ExecProc a co tam musis misto toho dat, aby ti to vratilo resultset.
No, to máš pravdu, že neviem, čo píšem do zdrojáku, lebo to nemám z kade vedieť. Robím to metódou pokus-omyl. Myslím tie veci s ADO komponetami. O ostatných sa aj niečo píše na Živě.cz či v knihe Mistroství v Delphi 6.
A teraz neviem, čo si myslel. To, že tam má byť namiesto DataModule1.ADOStoredProc.ExecProc riadok DataModule1.ADOStoredProc.Open, alebo niečo iné? Fakt neviem čo mi to robí, pretože to vždy zmaže celú databázu a vloží tam záznam s dnešným dátum a jeden s dátumom 30.12.1899.
No, pekne. Teraz mi blbne už aj samotné Delphi. Keď kliknem na ENTER, tak mi nevytvorí nový riadok, ale iba kurzor skočí o riadok nižšie, ako keby som stlačil šípku dolu. A zas keď kliknem na SPACE, tak mi nezrobí medzeru, ale sa len kurzor posunie o jeden znak doprava, ako keby som stlačil šípku doprava. Inak všetko ostatné funguje. Myslím písanie všetkých znakov a dokonca aj ich mazanie (BACKSPACE).
Nemas vypnuty Insert?
Díky, ja by som na to asi nikdy neprišiel.
Inak ten problém s nezobrazovaním dát z databázy pod WinXP som už vyriešil, no radšej tu nepíšem čím to bolo, lebo by ste ma asi zabili. Proste bolo to spôsobené len mojou hlúposťou alebo skôr nevšímavosťou (mimo Delphi).
A ešte mám jednu otázku: Ako môžem zistiť, či databázová tabuľka obsahuje nejaké záznamy alebo je prázdna? Myslím cez Delphi, keď to chcem použiť v podmienke: Ak je tabuľka prázdna, vloží záznam s určitými hodnotami a keď už nejaký záznam obsahuje, spustí procedúru z databázy (čo sa mi mimochodom už tiež podarilo urobiť).
Provedes dotaz:
select count(*) as Pocet from Tabulka
Vrati se ti pocet zaznamu v tabulce
Díky, ale nevracia to náhodou pri prázdnej tabuľke NULL?
Klídek, nikdo tě vraždit nebude, možná by to bylo zajímavé čím to bylo, třeba pro někoho jiného, aby si také tak nenaběhl. Hlavně, že ti to běží. Držím ti palce v dalším programování.
Ako som už vyššie písal, prerábam jeden starý program. Mám ho nainštalovaný v adresári Program Files, kde je aj databáza, ktorá beží cez ODBC. Všetky databázové tabuľky boli prázdne a preto sa mi v novom programe, ktorý robím, nič nezobrazovalo. Lenže ja som celý čas cez jedného SQL klienta pristupoval k druhej (rovnakej) databáze, ktorá bola v adresári s tým klientom a ktorá už obsahovala nejaké záznamy. Vtedy som si myslel, že stále pomocou môjho programu aj toho SQL klienta pristupujem k tej istej databáze. Prišiel som na to až vtedy, keď som mal spustený ten program, ktorý robím, a v tom istom čase som spustil toho SQL klienta. Ten SQL klient sa automaticky pripojil k tej dobrej databáze (čo som vtedy ešte nevedel), zrazu som sa čudoval, prečo sú databázové tabuľky prázdne, a potom mi to došlo.
Nedá sa nejak urobiť aby sa po stlačení ENTERu automaticky stlačilo konkrétne tlačidlo na formulári, v momente keď je kurzor v komponente Edit (teda keď niečo píšem)? Viem síce urobiť, aby sa po stlačení ENTERu niečo vykonalo, ale vždy sa mi pri tom ozve ten zvuk Windowsu, ktorý signalizuje, že sa niečo nedá (teda neviem to inak opísať).
A ešte nedajú sa nejak uvoľňovať zavreté formuláre z pamäti? Sledujem totiž, že stále keď otvorím formulár, program uloží do pamäte ďalších pár kB. Dokonca si jednotlivé formuláre stále držia svoje premenné po zavretí a opätovnom otvorení. Formuláre otváram príkazom ShowModal a zatváram príkazom Close. Keď použijem príkaz Free, tak konkrétny formulár už počas toho istého chodu programu neotvorím. To už sú princípy OOP, ktorým som sa zatiaľ nezaoberal (viem, čudné, keď programujem v Object Pascale
). Ale neviete mi aspoň poradiť ako uvoľniť premenné z pamäti pri zatváraní formulára?
Som síce už riadne OT, ale nechcem zbytočne zakladať novú tému.