31. august 2002 - 21:59Der er
10 kommentarer og 1 løsning
C++ Builder5, databaser
SP1:
select * from bord where Dato = 30-08-2002 dato er af type Date. (Interbase)
ovenstående giver tom resutat selom der findes tupler med ovenstående kritik.
jeg kan dog få en fields værdi m følgende: Query1->FieldByName(Dato)->Value;
select * from bord where nr = 1 ovenstående querien virker.
Det ser ud til at problemet med at læse værdier med typen Date.
sp2: Jeg forsøger at delete en række i en tabel således:
Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add(“delete from bord where navn = 4”); Query1->ExecSQL(); Query1->Open(); Forgæves. derbliver kastet en EDBEngineError exception som siger ’Table is read only’. men når jeg klikker på en DBNavigator1s delete button lykkes at slette rækken. Hvad gør jeg forkert?
1) har i forvejen afprøvet: select * from bord where Dato = '30-08-2002' 2) som sagt virker DBNavigator1s delete button uden besvær i samme program. ingen andre sw har tilgang til databasen
mærklig resultat, hva? jeg tror j bliver nødt til at ændre typen af dato til varchar(10)
select * from bord where dato > 30-08-2002 order by dATo
NAVN DATO X Y WIDTH HEIGHT COLOR BORDPLANNAVN ============================== =========== =========== =========== =========== =========== =========== ============
Ad SP1) Select på dato Du skal sikre dig at formatet af din dato i din select, svarer til det format den har i din InterBase database. Af ovenstående kunne det tyde på at du skal skrive:
select * from bord where dato = '30-AUG-2002'
Ad SP2) Read Only Det eneste jeg kan komme i tanke om, er at du har sat TQuery komponentens ReadOnly property til true. Hvis du bare dropper en TQuery komponent og skriver dit SQL-statement med det samme, burde du kunne lave en slet:
if (Query1->Active) Query1->Close(); Query1->SQL->Text = "delete * from bord where navn = '4'"; Query1->ExecSQL();
Jeg kan derimod godt forstå at du ikke kan lave en Open direkte derefter - dit SQL-statement er jo stadig en delete - og den kan man ikke vise ! Du skal have din oprindelige SQL select ind igen, inden du kan lave open:
if (Query1->Active) Query1->Close(); Query1->SQL->Text = "delete * from bord where navn = '4'"; Query1->ExecSQL();
Query1->SQL->Text = "select * from bord"; Query1->Open();
Jeg vil iøvrigt foreslå dig at have to TQuery componenter på din form - en til at vise data (f.eks. via TDBNavigator og et TDBGrid) og en anden til at lave dine updates med. Vær i den sammenhæng opmærksom på at du ikke kan lave Refresh() på en TQuery, men er nødt til at lave Close() + Open() for at de lavede ændringer afspejles i det viste. (Hvis du bruger en TTable i stedet, kan du lave refresh - og mange af de selects du laver i SQL kan du lave vha. Filter funktionen i stedet for.)
Desuden kan jeg sagtnes: Query1->FieldByName(“Dato”)->Value= “30-08-2002”; Så, jeg tviivler at det sku være noget m formatten.
Sp2: Jeg har også tænkt på den ReadOnly property, men det ser ikke ud til at TQuery skulle have en ReadOnly property. builderns dokumentation forslår det også:
Note: For SQL databases, if ReadOnly is true, you must also explicitly set the ReadOnly property to true for dataset components like TTable and TQuery.
Fatter det ikke. Desuden kan DBNavigator1 godt slette en række når man klikker Delete button.
Jeg kunne måske nedarve fra TQuery og definere en readonly property, __published: __property ReadOnly = {read=FReadOnly, write=FReadOnly, default=true};
men det ved jeg ikke om jeg skal kaste mig ud i.
Men ellers tak for de gode råd omkring flere TQuery Jeg har arbejdet med TTable og filter funktionen før. Jeg vil gerne bruge SQL den her gang.
Jeg kan kun komme i tanke om at det skulle være et InterBase relateret problem så, for det eksempel jeg har skrevet til dig, er omskrevet fra en stump kode vi anvender i produktion mod en DB2/400 (IBM AS/400 relationsdatabase) database med ODBC adgang.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.