Newsgroup: it.comp.lang.visual-basic
Titolo: [Ado.Net] Problemi campi contatori

Non riesco a trovare una soluzione pulita al seguente problema:
ho 2 tabelle:
Tabella Padre:
IdPadre   contatore
Nome      testo
Tabella Figlio:
IdFiglio  contatore
IdPadre   integer
Nome      testo
Il mio preblema è come gestire la seguente condizione:
- Creo una nuova riga Padre.
- Creo una nuova riga Figlio legata alla Padre appena creata.
Quando creo la riga Padre il campo IdPadre è 0 perchè il valore verrà
assegnato dal motore di db nella fase di memorizzazione, ma devo legare la
riga figlio al padre.
Con 
ado.net
 esiste una soluzione migliore della seguente:
- Inserisco nel tabella la riga nuova
- aggiorno il relativo dataadapter
- svuoto la tabella
- riempio la tabella
- ricerco la riga che ho inserito e leggo il valore del contatore
purtroppo con tabelle moltro grandi non è una soluzione ottimale...
Grazie per qualsiasi aiuto
xandre
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Non ho ben capito il problema....
E' il recuperare l'identita' del padre?
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset
Dim nuovo As Long
Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data
Source=C:\access\dbprova.mdb;Persist Security Info=False"
cn.Open
cn.Execute "INSERT INTO TabeAutoNumber (Descrizione) VALUES ('prova')"
Set rs = New ADODB.Recordset
Set rs = cn.Execute("SELECT @@IDENTITY AS nuovoID")
(Funziona anche senza AS nuovoID)
e dopo la riutilizzi nell'insert del figlio....

p.s.
il pezzettino di codice l'ho spudoratamente copiato dalla rete...
grazie a chi l'ha scritto: mi ha
risparmiato il fastidio di aprire quello che avevo gia' scritto :=))

 Set rs = cn.Execute("SELECT @@IDENTITY AS nuovoID")
Credo che la strada sia in effetti quella, ma credo anche che non sia
"sicuro" effettuare l'aggiornamento e l'interrogazione del database in due
distinti momenti: in un ambiente multiutente è sempre possibile, per
quanto improbabile, che tra i due istanti di tempo avvenga l'inserimento
di un altro record da parte di un altro client, e la cosa produrrebbe
risultati "indesiderabili".
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo


Grazie Silk,
speravo ci fosse qualcosa di integrato in 
ado.net
proverò a fare qualche test con DataRelation e ForeignKeyConstraint, ma ho
seri dubbi!!!
Comunque la tua soluzione è ottima e funziona bene.
Per chi utilizza 
ado.net
 ho un paio di consigli:
- 1) aprire la connessione prima dell'update del DataAdapter e chiuderla
dopo l'esecuzione del command, altrimanti il DataAdapter apre, aggiorna e
chiude in automatico la connessione e il command restituisce un valore
DbNull.
- 2) eseguire il command il metodo EsecuteScalar, in questo modo si
ottiene direttamente il valore e non un datarow
Esempio:
Dim id as Integer = New XxxCommand("SELECT @@IDENTITY",
[connessione]).ExecuteScalar
dove:
XxxCommand dipende dal Provider utilizzato
[connessione] è la connessione utilizzata per accedere al DB
Grazie


 credo anche che non sia "sicuro" effettuare l'aggiornamento 
non penso sia necessario fare l'aggiornamento del DataAdapter e
l'esecuzione del command all'interno della stessa Transaction, perchè la
query "SELECT @@IDENTITY" resituisce l'id dell'ultima riga inserita nella
connessione in corso.
Infatti se chiudi e riapri la connessione la query restituirà un valore
DbNull, pertanto se qualche altro utente inserirà una nuova riga sarà
comunque con una connessione differente... o almeno lo spero ;)
Ciao
xandre72
-- 


 connessione in corso.
Effettivamente il particolare della "connessione in corso" mi era sfuggito.
Molto molto bene, visto che pare che jet 4.0 fornisca il supporto per
questo tipo di interrogazione...
-- 
Salutoni
Sergio
Per rispondere... togli il group dall'indirizzo
questo articolo e` stato inviato via web dal servizio gratuito 


 questo tipo di interrogazione...
Problema del recupero dell'ultimo id inserito su ACCESS durante l'update
del dataadapter per C# e 
VB.NET
.
http://community.visual-basic.it/lucianob/archive/2005/01/07/3062.aspx
Invece questo contiene il corrispondente per ADO/DAO / ACCESS nei due
metodi:
- nel recordset 
- tramite un comando SQL
http://community.visual-basic.it/lucianob/archive/2005/02/11/5476.aspx
-- 


Con MySql e SqlServer esistono istruzioni ad hoc (basta cercare "last inserted record id" con google).
Se usi Access... perché usi Access? Comunque, per Access non so.