Newsgroup: it.comp.lang.delphi
Titolo: Indici ClientDataset con Mysql

Salve ragazzi,
sto lavorando su un db mysql e avevo necessitï¿œ di alcune info.
sto lavorando con dbxquery, dsprovider e clientdataset.
apro la query poi la richiudo lavoro sul cds e poi applyupdates.
nel caso di query normali no problem tutto ok, ma adesso ho la necessitï¿œ 
di conoscere il valore dell'indice autoincrementante nel db prima di 
fare il post(classica master-detail), come faccio?
grazie in anticipo :)

l'argomento è stato trattato spesso su questo ng... Ti sintetizzo
alcune cose:
1) Se usi autoinc, il modo in cui conoscere l'ultimo id assegnato puo
dipendere anche dal db che usi.
Ad esempio, su sqlserver di zio billy esiste select @@identity from
nonsocosa...
Ma cmq, a prescindere dal modo e dal db, sei "costretto" a chiedere
questa info al db.
Questo è un buon motivo per NON USARE AUTOINC...
2) Se non usi autoinc, hai varie possibilita:
a) alcuni db come oracle, postgres, interbase e firebird hanno delle
cose chiamate sequence o generator.
Quindi, tramite una stored procedure, tu "chiedi" al database un id,
lo scrivi nel campo che ti serve e l'applicazione lo conosce a priori
senza dover aspettare che il db abbia inserito il record.
b) se usi un db che non ha un meccanismo del genere, si puo applicare
una strategia simile usando al posto delle sequence una tabella di
contatori. Per il resto la logica è la stessa
c) nei casi in cui un id non puo essere fornito dal server, ogni
client avra un identificativo che sara usato insieme ad un valore
sequenziale calcolato localmente come primary key.
Queste 3 tecniche spostano la responsabilita del calcolo della primary
key dal DATABASE alla APPLICAZIONE.
In questo modo è l'applicazione che ha il controllo.
A.

 
quindi il tuo consiglio � di lasciar fare ai client con una procedura il 
calcolo del pk... mmm cosa interessante il db in questione (MySql) non 
ha trigger quindi niente stored come per il mio beneamato firebird, ma 
la tecnologia avanza e noi dobbiamo stargli dietro, quindi mi creo una 
tabella chiedo il valore aggiorno e poi tutto ok.
ho capito bene?
ps.
grazia e alberto :)

 tabella chiedo il valore aggiorno e poi tutto ok.
non proprio....se usi direttamente una tabella potresti avere problemi
sulla concorrenza...
A.

> quindi il tuo consiglio � di lasciar fare ai client con una procedura il

sto usando easyphp (per comodit�), e non ci sono trigger nella struttra 
del db, almeno non in stile firebird i campi id al momento sono autoinc
ancora grazie :)

C_thelegend ha scritto:

ho installato adesso la ver 5.1 sto ancora cercando una soluzione al 
problema... purtoppo non ho mai avuto a che fare con mysql prima se 
qualcuno mi da una mano gliene sono molto grato :)

con MySql per ricavare l'id dell'ultimo record inserito devi fare una
SELECT LAST_INSERT_ID() Numero

 SELECT LAST_INSERT_ID() Numero
ma quale id mi riporta?
l'ultimo id del client in sessione o l'ultimo id della tabella in 
assoluto? ed in pi� � conveniente usarlo per una app. multi-thread? 
diciamo che ci gireranno una decina di client...
grazie ancora... ;)

C_thelegend ha scritto:

mi rispondo da solo dopo un p� di google.... :D
solo per il client corrente o meglio per il resource id corrente... :)
quindi ottimo saluti e grazie a todos :)

dal sito di mysql
For LAST_INSERT_ID(), the most recently generated ID is maintained in
the server on a per-connection basis. It is not changed by another
client. It is not even changed if you update another AUTO_INCREMENT
column with a nonmagic value (that is, a value that is not NULL and
not 0). Using LAST_INSERT_ID() and AUTO_INCREMENT columns
simultaneously from multiple clients is perfectly valid. Each client
will receive the last inserted ID for the last statement that client
executed.

Brunello ha scritto:

ciao brunello e grazie,
ma mi domandavo ogni connessione genera l'id per se stessa e fin qui ok
ma come faccio a sapere che mi sto riferendo a quella master?
mi spiego
mettiamo che stamattina faccio il primo insert ed avr� 1.
poi spengo tutto (quindi chiusura connessione) e torno dopopranzo, 
riaccendo e quindi altra conn. cosa succede? avr� sempre 1?
grazie

parlando di una connessione per-connection tutto il discorso è
vincolato al fatto che ci sia continuità di connessione nella
richiesta dati, non ho mai provato ma penso che ad una nuova
connessione last_insert_id() non riporti nulla, ciao Brunello

 connessione last_insert_id() non riporti nulla, ciao Brunello
e quindi non risolve il mio problema..
io dovrei creare una classica master/detail tipo fattura testa e fattura 
dettaglio come faccio a sapere l'id della query di testa in modo da 
legare il dettaglio?
ps.
grazie per la tua disponibilit� brunello :)

C_thelegend ha scritto:

ho notato che molti usano il max(id) ma onestamente sta cosa mi mette i 
brividi...