|
| Borland C++ builder/måske Delphi TSQLQuery~ Fra : Kasper Kristensen |
Dato : 16-01-03 13:30 |
|
Hvis nogle derude har erfaring med Borlands TSQLQuery komponent sammen med
MySQL, så vil jeg gerne have hjælp til et par nybegynder problemer. Jeg
koder i C++ builder, men mon ikke problemstillingen er den samme med Delphi?
Det jeg vil er at indsætte en record som har AUTO_INCREMENT index for
derefter at få ID'en på den netop indsatte record. I SQL altså:
<kode>
INSERT INTO error(user_id) values (666);
SELECT LAST_INSERT_ID() AS last_id FROM error;
</kode>
Bemærk at user_id er en foreign key som intet har at gøre med den id jeg vil
have tilbage.
Nuvel, virker fint i f.eks MySqlCC eller en anden front-end, men så kommer
vi til TSQLQuery();
Problemer:
1)
Jeg har en variabel Query af typen TSQLQuery(). Vælger jeg dens SQL property
popper en editor op, hvor jeg indtaster ovenstående kode.
Ved eksekvering af "Query->Open()" fås en execption med MYSQL parser fejl
ved mit semikolon. Faktisk kan jeg slet ikke bruge semikolon uden en
parserfejl.
Kan man da ikke bruge semikolon i SQL property'en?
2)
OK jeg prøver så at benytte to forskellige queries: en til insert og en til
efterfølgende til select last_insert_().
<kode>
InsertQuery->Close();
InsertQuery->ExecSQL(); // Da der ikke returnes noget
GetIDQuery->Close();
GetIDQuery->Open(); // Her returneres noget
</kode>
Mine Close() skyldes, at jeg har lært man altid skal lukke sin query inden
man laver en ny. Jeg har prøvet at fjerne dem uden forskel.
Ingen execption nu, men jeg får resultatet 0 tilbage i last_id hver gang.
Jeg har på fornemmelsen at det skyldes at LAST_INSERT_ID() er session
baseret og at ExecSQL() måske lukker forbindelsen.
3)
Generelt MySQL: Hvorfor returnerer "SELECT LAST_INSERT_ID() AS last_id FROM
error;" en hel kolonne med den samme værdi i og ikke bare en 1 søjle X 1
række tabel?
Håber jeg har gjort mig forståelig.
Cheers,
Kasper
| |
Peter Brodersen (16-01-2003)
| Kommentar Fra : Peter Brodersen |
Dato : 16-01-03 13:42 |
|
On Thu, 16 Jan 2003 13:29:52 +0100, "Kasper Kristensen"
<spamkhkspam@mindgroup.dk> wrote:
>Kan man da ikke bruge semikolon i SQL property'en?
I de andre MySQL-api'er, jeg kender, kan man ikke.
>Jeg har på fornemmelsen at det skyldes at LAST_INSERT_ID() er session
>baseret og at ExecSQL() måske lukker forbindelsen.
Det lyder sandsynligt.
>Generelt MySQL: Hvorfor returnerer "SELECT LAST_INSERT_ID() AS last_id FROM
>error;" en hel kolonne med den samme værdi i og ikke bare en 1 søjle X 1
>række tabel?
Du skal ikke vælge tabelnavn. LAST_INSERT_ID() giver dig den sidste
indsatte ID for den aktuelle mysql-connection. Hvis du vælger et
tabelnavn får du - ligesom normalt - en række ud for hver row, der er
i tabellen "error". Det er ikke meget anderledes end:
SELECT (2+2);
- én row.
SELECT (2+2) FROM error;
- alle rows køres igennem, og hver row outputter det samme (nemlig 4).
--
- Peter Brodersen
| |
Kasper Kristensen (16-01-2003)
| Kommentar Fra : Kasper Kristensen |
Dato : 16-01-03 14:21 |
|
> Du skal ikke vælge tabelnavn. LAST_INSERT_ID() giver dig den sidste
> indsatte ID for den aktuelle mysql-connection. Hvis du vælger et
> tabelnavn får du - ligesom normalt - en række ud for hver row, der er
> i tabellen "error". Det er ikke meget anderledes end:
>
> SELECT (2+2);
> - én row.
>
> SELECT (2+2) FROM error;
> - alle rows køres igennem, og hver row outputter det samme (nemlig 4).
>
> --
> - Peter Brodersen
Ja selvfølgelig. Elementært min kære Watson.
Kasper
| |
|
|