/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
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



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408926
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste