Avatar billede ghandi1346 Nybegynder
31. august 2002 - 21:59 Der 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?
Avatar billede olly Nybegynder
31. august 2002 - 22:02 #1
1) select * from bord where Dato = '30-08-2002'
Avatar billede olly Nybegynder
31. august 2002 - 22:04 #2
2) Måske fordi du har et eller andet program åben på samme tid, som blokere databasen. Men lyder ellers mystisk.
Avatar billede ghandi1346 Nybegynder
01. september 2002 - 02:17 #3
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
Avatar billede olly Nybegynder
01. september 2002 - 11:19 #4
Og du er sikker på du staver Dato sådan! At det ikke er med små eller andet?
Avatar billede ghandi1346 Nybegynder
01. september 2002 - 15:44 #5
ja, d gør ingen forskel, jeg kan sagtnes:
select * from bord order by dATo

NAVN DATO  X  Y WIDTH  HEIGHT  COLOR BORDPLANNAVN
============================== =========== =========== ===========
3 20-AUG-2002  5  5    38    66    0 1           
2                              21-AUG-2002          5          5          38          66          0 1           
2                              30-AUG-2002          5          5          38          66          0 1           
3                              30-AUG-2002          5          5          38          66          0 1           
4                              30-AUG-2002          5          5          38          66          0 1           
1                              31-AUG-2002          5          5          38          66          0 1
Avatar billede ghandi1346 Nybegynder
01. september 2002 - 15:50 #6
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
============================== =========== =========== =========== =========== =========== =========== ============

3                              20-AUG-2002          5          5          38          66          0 1           
2                              21-AUG-2002          5          5          38          66          0 1           
2                              30-AUG-2002          5          5          38          66          0 1           
3                              30-AUG-2002          5          5          38          66          0 1           
4                              30-AUG-2002          5          5          38          66          0 1           
1                              31-AUG-2002          5          5          38          66          0 1
Avatar billede ghandi1346 Nybegynder
01. september 2002 - 15:53 #7
Tabel def:
/* Extract Table BORD */

/* Table: BORD, Owner: SYSDBA */
CREATE TABLE BORD (NAVN VARCHAR(30) NOT NULL,
        DATO DATE NOT NULL,
        X INTEGER default 5
,
        Y INTEGER default 5
,
        WIDTH INTEGER default 38
,
        HEIGHT INTEGER default 66
,
        COLOR INTEGER default 0
,
        BORDPLANNAVN VARCHAR(10) default "1"
,
PRIMARY KEY (NAVN, DATO))
,foreign key (bordPlannavn) references Bordplan (navn);
Avatar billede soepro Nybegynder
02. september 2002 - 10:57 #8
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();
Avatar billede soepro Nybegynder
02. september 2002 - 11:03 #9
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.)
Avatar billede ghandi1346 Nybegynder
03. september 2002 - 15:29 #10
SP1:
dato = '30-AUG-2002'

er afprøvet. Resultere i casting exception.

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.
Avatar billede soepro Nybegynder
04. september 2002 - 09:07 #11
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.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester