Newsgroup: it.comp.lang.visual-basic
Titolo: [ADO.NET] Aggiornamenti master-detail su dataset

Ho un database con due tabelle, una č quella degli ordini e l'altra quella del
dettaglio ordine, legate da una relazione uno a molti tra di loro.
Dato che il dataset in .net č disconnesso dal database sorgente, come faccio ad
attribuire un identificativo univoco ad un ordine che sto inserendo, indicativo
indispensabile per poter aggiungere i dati di dettaglio?
Temo che sia un problema assolutamente banale, cosě banale che nessuno dei testi
che ho consultato ne parla...
In ado bastava aprire i cursori lato server e si leggeva il valore "contatore"
dato dal db al record appena inserito, ma in una logica disconnessa, quale deve
essere l'approccio?
Qualche ideuccia in merito ce l'ho, ma č cosě "incasinata" che preferisco prima
sapere se esiste un metodo ufficiale.
Ringraziamenti anticipati
--
Salutoni
Sergio

non mi sembra una cosa tanto banale, a dire il vero......
sul libro di Balena c'č tutto un capitolo sull'uso di 
ADO.NET
, spiegando
bene come risolvere la concorrenza dei dati. Purtroppo adesso non ce l'ho
sotto mano, č un vero peccato......
cmq, cosě a spanne, e per quello che mi ricordo di aver letto, mi sa che
devi riassegnare gli ID in fase di aggiornamento del dataset, quando sai con
esattezza il contenuto del db.....
purtroppo non so dirti nulla di piů specifico.....
--
Damiani Liborio Igor
ig...@igordamiani.it
 - 
dam...@italiainfiera.it
 - 
idam...@hotmail.com
http://www.igordamiani.it
ICQ : 11847262

 quando sai con esattezza il contenuto del db.....
Già, è quello che pensavo anche io, quindi addio ai campi autoincrementanti
utilizzati come id del record. Lo schema dovrebbe essere:
1)importazione tabelle master e detail, magari anche solo come schema
2)inserimento di un vincolo di integrità referenziale uno a molti con
aggiornamento a catena
3)inserimento dei nuovi record, con id della tabella master generato in locale
4)aggiornamento delle tabelle del database, con intercettazione degli errori di
duplicazione chiave primaria
5) se c'è l'errore si modifica l'id del master, confidando nella modifica in
cascata dei riferimenti nel detail
6) si riprova l'inserimento eccetera.
Mi pare un pochetto laborioso: se le cose stanno così mi pare che la decantata
"scalabilità" vada un po' a farsi friggere. Spero di essere io ad aver preso
qualche abbaglio
--
Salutoni
Sergio

 di parlare di una cosa. chissà a quale dei due appartiene questa
Proprio...
Ho inoltre riscontrato un altro problema : se cancello alcuni record e poi
ne aggiungo degli altri succede una cosa strana, il primo record aggiunto
viene "duplicato", ovvero me lo ritrovo nella tabella con due ID
differenti, uno giusto e l'altro sbagliato (un ID di un record
precedentemente cancellato).
Purtroppo non ho con me .NET in questo momento e il discorso poò sembrare
caotico, ma appena posso posterò il codice incriminato.
La questione sembra semplice, ma non lo è affatto!!!
Ciao, Luca.
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

Avevo risolto con una query multipla.
Considera che gli utilizzatori non erano molti , quindi la soluzione mi
soddisfava
Query Multipla - Ritorno ID
Dim sql As String
        sql = "INSERT INTO tablename (campo1,campo2) "
        sql &= " VALUES ('" & valore1 & "','" & valore2 & "');"
        sql &= "SELECT IDENT_CURRENT('" & tablename & "')"
        Dim cmd As New SqlClient.SqlCommand(sql, con)
        Dim dr As SqlClient.SqlDataReader = cmd.ExecuteReader
        Do While dr.Read
            Dim i As System.Int32 = (dr(0)) 'ID restituito
            Me.lblID.Text = Convert.ToString(i)
        Loop
        dr.Close()
giuseppeD

  sql &= "SELECT IDENT_CURRENT('" & tablename & "')"
Naturalmente mi ero dimenticato di dirlo, ma lavoro con un database access...
Supporterà l'ident_current?
Mo' provo....
--
Salutoni
Sergio

 access... Supporterà l'ident_current?
No, non lo supporta :-(
--
Salutoni
Sergio


Infatti
da un appunto scritto il 18/01/2003 leggo:
"Il motore Jet non sopporta le istruzioni query multiple.
Attualmente non riesco a blocare l'intera tabella ma solo un record."
Chissà se alcuno è riuscito a bloccare un'intera tabella Access con 
ADO.NET
.
L'alternativa per utilizzare il contatore del Jet potrebbe essere inserire
un campo riguardante i dati dell'inseritore , es. nome utente o macchina , e
successivamente rilevare il numero ID max dove WHERE=.....
Consideriamo che in multiutenza i nomi delle macchine sono uniche.
Comunque se si tratta di dati di produzione sequenziali , es. arrivi ,
prodotti , ecc. e no di tabelle base , es. clienti , città ; con le
controindicazione che offre Jet penserei più volte prima di utilizzare il
contatore tabellare.
Un pensierino su una tabella contatore , con un campo e un solo record , in
considerazione che un record è bloccabile , lo prenderei in pensiero.
giuseppeD