Newsgroup: it.comp.lang.visual-basic
Titolo: [?] Leggere ID dopo .Update

Dunque....il mio problema è questo.......
ho un database sotto SQL-Server, che apro tramite ADO 2.6.....con una bella
connessione creata on-the-fly (senza passare da ODBC)......tramite:
-----------------------
Set conn = Server.CreateObject("ADODB.Connection")
conn.ConnectionString="Provider=SQLOLEDB.1;Persist Security Info=False;User
ID=" & Utente & ";Initial Catalog=" & Database & ";Data Source=" &
NomeServer & ";PWD=" & Password
conn.Open
-----------------------
dopo inizializzo un recordset, aggiungo un record alla tabella Utenti.....
Utenti.Addnew
...salvataggio di tutti i campi.....
Utenti.Update
Dopo l'update vorrei leggere il valore del campo ID (contatore), ma questo
continua a darmi NULL (o vuoto, o cheneso)......
l'unico modo che ho trovato è quello di riaprire un altro recordset con
qualche clausola WHERE ben congegnata per andare a riprendermi il record che
ho aggiunto prima.......
Domandona : perchè dopo l'Update non riesco a leggere al volo il valore del
campo contatore??????
ho dato un'occhiata ad MSDN, e ho visto i metodi .Resync .Requery che in
teoria dovrebbero aggiornarmi (soprattutto il primo che ho detto) il
recordset sulla base dell'effettivo contenuto del db, ma quando li uso, mi
dice che non sono supportati dal db.....come faccio????
grazie a chiunque possa darmi una dritta!!!!
--
Damiani Liborio Igor
idam...@hotmail.com
 - 
igor.d...@light.it
http://www.igordamiani.it
ICQ : 11847262

 conn.Open
CUT
io ci provo a risponderti...(è una pagina ASP ?)...al resync MSDN dice
"
Use the Resync method to re-synchronize records in the current Recordset
with the underlying database. This is useful if you are using either a
static or forward-only cursor but you want to see any changes in the
underlying database. Calling the Resync method cancels any pending batch
updates.
Unlike the Refresh method, the Resync method does not re-execute the
Recordset object's underlying command; new records in the underlying
database will not be visible.
If the attempt to resynchronize fails because of a conflict with the
underlying data (for example, a record has been deleted by another user),
the provider returns warnings to the Errors collection but does not halt
program execution. A run-time error occurs only if there are conflicts on
all the requested records. Use the Filter property (adFilterAffectedRecords)
and the Status property to locate records with conflicts.
Remote Data Service Usage The Resync method is not available on a
client-side (ADOR) Recordset. "
ma già lo sapevi vero....scusa ma sacrificare un campo e inserire un
datetimestamp chiudere il db e riaprirlo col datetimestamp più alto ti dà
l'ultimo...(se è una pagina ASP a meno che non sia arrivato un altro utente
internet ...ma allora ti puoi creare alcuni var session che tengono traccia
di n utenti...o mandare un cookie col datetimestamp)
mi viene questo di getto....scusa se non ti soddisfa!
bye man!
(scusate l'html!)

Se hai sql server la tua non mi sembra la soluzione migliore...
Racchiudi in un'unica transazione il tutto; del tipo
begin trans q; insert into tuatabella ........; select @@identity as tuoid;
commit trans q
Al posto di @@identity (che ti restituisci l'ultimo ID inserito), che in
casi particolari potrebbe non esser corretta, puoi fare un select top 1 id
order by id desc

 grazie a chiunque possa darmi una dritta!!!!
Usando ADO ..
Utenti.Filter = adFilterFetchedRecords
Utenti.MoveLast
LastId = Utenti("Utenti_Id")
Utenti.Filter = adFilterNone
Saluti

Devi leggere la variabile @@Identity
Se stai usando VB, VBA o VBScript, puoi scrivere qualcosa del genere (salto
qualcosa, ma dovrebbe esserti tutto chiaro):
[...]
rsPippo.Open
oConn.BeginTrans
With rsPippo
    .AddNew
    .Fields("Campo1") = "aaaaaaaaa"
    .Fields("Campo2") = "bbbbbbbbb"
    .....
    .Update
    ID = oConn.Execute("SELECT @@IDENTITY").Fields(0)
End With
oConn.CommitTrans    'Qui, eventualmente, gestisci anche il Rollback

"koo" <koo@k.k> ha scritto nel messaggio news:9oujeo$keu$1...@serv1.iunet.it...

Non l'ho mai usato @IDENTITY ma immagino sia
ID = oConn.Execute("SELECT @@IDENTITY FROM <NomeTabella>").Fields(0)
giusto ?
Saluti

 giusto ?
Si e no. Diciamo che non è indispensabile specificare l'origine della
tabella quando i dati non devono essere prelevati da essa.
@@IDENTITY è una veriabile di sistema, come @@ERROR e altre.
L'istruzione SELECT di SQL (se parliamo di Access è diverso: devi
specificare una tabella... una qualunque, ma devi specificarla) "seleziona"
un valore.
Ora, se tu devi fare un semplice calcolo, puoi tranquillamente scrivere:
DECLARE    @a    int
DECLARE    @b    int
SELECT @a = Pippo FROM TAB_Pippi WHERE ....
SELECT @b = Pluto FROM TAB_Pluti WHERE ....
SELECT @a + @b
Mettendo questo codice in una stored procedure (o in una semplice stringa),
puoi scrivere:
Valore = oConn.Execute("Nome_STored_Procedure").Fields(0)
o, utilizzando una stringa:
Valore = oConn.Execute(strSQL).Fields(0)

 Valore = oConn.Execute(strSQL).Fields(0)
Ok .. fin qui tutto semplice (uso abbastanza frequentemente le SP).
Quello che non capisco è se @@IDENTITY contenga l'ultimo valore creato da un
campo con identità oppure cos'altro;
cosa succede se 2 utenti aggiungono contemporaneamente un record alla stessa
tabella (ma il problema si verifica anche  per tabelle diverse) ?
Grazie ..
    Saluti

 DECLARE    @a    int
