|
|
IN-VESTI DNW!!! Sono finalmente arrivate le nuovissime T-Shirt di DotNetWork!!! Con soli 15,00 € ci sosterrai nelle spese di gestione della Community e ti invieremo a casa una splendida maglietta. Se vuoi contribuire al mantenimento di DotNetWork.it Vai sulla pagina Iscrizioni Effettua il pagamento usando IWBank Oppure un Bonifico bancario (le coordinate sono sulla pagina Iscrizioni), inviaci una mail a support@dotnetwork.it indicandoci la tua taglia e l'indirizzo di spedizione. Non appena verificata la ricezione del pagamento provvederemo a spedirti la tua T-Shirt. Le magliette sono disponibili nelle taglie S-M-L-XL-XXL (in caso di esaurimento di una delle taglie, indica quella di "Backup"). Grazie per IN-VESTIRTI con NOI!!! .:DotNetWork Founders:.
|
|
|
|
|
ADO .Net 2.0 e tabelle in relazione
Ultimo Post 23 mag 2009 01.09 by Salvatore. 6 Risposte.
|
Ordina:
|
 Posts:4
 |
| 24 mar 2009 08.25 |
|
Ho appena finito di leggere l'articolo relativo ad ADO .Net 2.0, e devo dire che è scritto veramente bene. Purtroppo però, non ho ancora risolto il mio "enigma". Spero di non dilungarmi troppo nell'esporlo.
DB Elementi (id-Autoincrment,NOME-nvarchar) Prova (id-Autoincrement, Totale-Decimal) Rel (idProva-idElemento,Nome) In pratica Rel mette in relazione una riga di Prova con n righe di elementi. Il campo nome di rel è la copia del campo nome in Elementi.
Visual studio 2005 Ho aggiunto un'origine dati, ovviamente indicando le tre tabelle su citate. Facendo ciò, mi sono ritrovato le tre entità nell'albero di radice ProvaDBDataSet (NOme del mio dataset). In particolare il nodo Prova, oltre alla voce id e totale, ha anche un nodo figlio Rel, e cioè tutte le righe di Rel in relazione con ogni riga di prova. Trascinando prima il nodo prova e successivamente il nodo figlio Rel su di una form, ottengo quello che cercavo. E cioè la visualizzazione di tutte le righe di Prova, con le relative righe di rel, ovviamente in due datagridview distinte.
Arrivo al dunque Gestisco l'inserimento di un nuovo record prova e dei relativi record di rel. Infatti cliccando sull'icona (+ gialla) del binding navigator, ottengo un nuovo record prova. Inserendo i valori nella griglia che visualizza i dati di rel e salvando, ottengo l'inserimento voluto. Il problema nasce con la multiutenza. Immaginiamo 10 record in prova. Se due utenti popolano il proprio datatable in locale, si ritrovano 10 record in prova. Uno dei due cliccando sull + gialla ottiene un nuovo record prova con id 11. Stessa cosa succede all'altro utente quando clicca sulla +. Il problema non sussiste se fosse finita qui. Ma dovendo aggiungere dati alla datagridview rel: idProva idElemento Voce si ha che l'ultimo dei due che effettua il salvataggio si vede risucchiare i dati di rel dal record prova inserito dall'altro utente, infatti entrambi inseriranno record in rel che hanno idProva =11. Come si può risolvere? So di esseremi dilingato tanto, e magari di non essere stato abbastanza chiaro.
Spero che qualcuno conosca il modo per aggirare questo problema. |
|
|
|
|
 Posts:811
 |
| 24 mar 2009 09.02 |
|
Carissimo Salvatore,
per quanto un pochino confusa la tua richiesta sembra essere la seguente:
Se 2 utenti aggiungono records alle tabelle insieme come funziona il tutto?
Ti consiglio di dare un'occhiata all'SQL generato nel codice da parte del wizard che tu utilizzi, se guardi la parte di Insert Into, sono quasi certa che l'ID non viene passato alla Stored procedure o al codice generato al volo, perché tu citi che i tuoi campi sono di tipo autoincrement quindi non scrivibili, pertanto dovrebbe essere il gestore dati che automaticamente committa le modifiche nell'ordine corretto, salvando prima il record di testata, rileggendosi gli ID nuovi generati automaticamente e aggiornandoli sulle righe corrispondenti.
(Questo nella teoria e ti invito a provare e vedere se funziona con un singolo utente)
Se funziona con un singolo utente non ci sarà alcun tipo di problema con la multiutenza visto che è il database a prendersi cura di tutto.
Però, per sicurezza, per evitare che la tua tabella in memoria abbia degli ID anche solo simili a quelli veri nelle nuove righe, ti invito a fare in modo che la gestione del campo ID sulla datatable creata nel dataset sia così posta:
AutoIncrement = true, AutoIncrementSeed = -1 AutoincrementStep = -1
In questo modo, le nuove righe di tutti gli utenti avranno ID -1,-2, -3 ecc. e per prima cosa in debug tu lavorerai meglio, secondariamente, i numeri veri positivi verranno forniti dal database.
Il mio dubbio è il seguente: Il Binding quel che è che hai creato con il wizard è sufficientemente intelligente da sostituire i campi relazionati correttamente?
Lo chiedo perché per mia natura (e tutti coloro che mi conoscono lo sanno) non uso mai i wizard e preferisco gestire gli aggiornamenti in modo manuale, in modo da avere io il controllo sulla macchina e non la macchina avere il controllo su di me...   
Facci sapere come è andata
saluti Sabrina
Inserito da Salvatore su 24 mar 2009 09.25
Ho appena finito di leggere l'articolo relativo ad ADO .Net 2.0, e devo dire che è scritto veramente bene. Purtroppo però, non ho ancora risolto il mio "enigma". Spero di non dilungarmi troppo nell'esporlo.
DB Elementi (id-Autoincrment,NOME-nvarchar) Prova (id-Autoincrement, Totale-Decimal) Rel (idProva-idElemento,Nome) In pratica Rel mette in relazione una riga di Prova con n righe di elementi. Il campo nome di rel è la copia del campo nome in Elementi.
Visual studio 2005 Ho aggiunto un'origine dati, ovviamente indicando le tre tabelle su citate. Facendo ciò, mi sono ritrovato le tre entità nell'albero di radice ProvaDBDataSet (NOme del mio dataset). In particolare il nodo Prova, oltre alla voce id e totale, ha anche un nodo figlio Rel, e cioè tutte le righe di Rel in relazione con ogni riga di prova. Trascinando prima il nodo prova e successivamente il nodo figlio Rel su di una form, ottengo quello che cercavo. E cioè la visualizzazione di tutte le righe di Prova, con le relative righe di rel, ovviamente in due datagridview distinte.
Arrivo al dunque Gestisco l'inserimento di un nuovo record prova e dei relativi record di rel. Infatti cliccando sull'icona (+ gialla) del binding navigator, ottengo un nuovo record prova. Inserendo i valori nella griglia che visualizza i dati di rel e salvando, ottengo l'inserimento voluto. Il problema nasce con la multiutenza. Immaginiamo 10 record in prova. Se due utenti popolano il proprio datatable in locale, si ritrovano 10 record in prova. Uno dei due cliccando sull + gialla ottiene un nuovo record prova con id 11. Stessa cosa succede all'altro utente quando clicca sulla +. Il problema non sussiste se fosse finita qui. Ma dovendo aggiungere dati alla datagridview rel: idProva idElemento Voce si ha che l'ultimo dei due che effettua il salvataggio si vede risucchiare i dati di rel dal record prova inserito dall'altro utente, infatti entrambi inseriranno record in rel che hanno idProva =11. Come si può risolvere? So di esseremi dilingato tanto, e magari di non essere stato abbastanza chiaro.
Spero che qualcuno conosca il modo per aggirare questo problema. |
|
| Sabrina |
|
|
 Posts:4
 |
| 24 mar 2009 10.38 |
|
Ciao Sabrina, grazie 1000 per l'interessamento. Nonostante sia contorta la mia espozione del problema, almeno da te, sono stato compreso.
Per quanto riguarda la generazione degli id in automatico, il tutto avviene correttamente, con un singolo utente. I problemi nascono in multiutenza. Ti faccio un esempio Utente A, nuovo record Prova con id=11 - Record in Rel [11,1,A - 11,2,B] Utente B, nuovo record Prova con id=11 - Record in Rel [11,2,B - 11,3,C] L'utente A salva per primo, e tutto avviene correttamente, rispettando id e tutto il resto. Quando l'utente B salva si ha che il suo record Prova avrà id=12 nel DB. Mentre i suoi record di Rel vengono inseriti, ma in relazione al record Prova inserito dall'utente A.
Non ho ancora provato la soluzione che mi hai proposto, quella relativa alla gestione dei campi Id settando AutoIncrement = true, AutoIncrementSeed = -1 AutoincrementStep = -1.
Come te, anche io ho dubbi sul corretto funzionamento, o megli della super intelligenza del Binding, altrimenti l'avrebbe già dimostrata.
Io una soluzione l'ho già implementata, e cioè, ogni volta che utente ha intenzione di creare un nuovo record in Prova, la crezione non avviene solo in locale, ma anche sun DB, inserendo il record e prelevando il nuovo Id. Così facendo ogni utente ha un id del proprio record Prova univoco, e gli inserimenti vengono effettuati correttamente.
Secondo è una soluzione corretta? |
|
|
|
|
 Posts:811
 |
| 24 mar 2009 12.43 |
|
La telepatia è un dono che i programmatori possiedono per natura, infatti anche io come te, per la gestione di tabelle relazionate utilizzo la generazione automatica della chiave primaria tramite una bellissima tabella di contatori che viene aggiornata immediatamente dopo aver generato l'ID nuovo usando una transazione in modo che non ci possa essere concorrenza. La gestione degli ID negativi temporanei per i nuovi record non è ovviamente un'idea mia ma deriva dalla lettura dei libri del Sig. Sceppa, e serve a toglierti molti problemi.
saluti Sabrina
Inserito da Salvatore su 24 mar 2009 11.38
Ciao Sabrina, grazie 1000 per l'interessamento. Nonostante sia contorta la mia espozione del problema, almeno da te, sono stato compreso.
Per quanto riguarda la generazione degli id in automatico, il tutto avviene correttamente, con un singolo utente. I problemi nascono in multiutenza. Ti faccio un esempio Utente A, nuovo record Prova con id=11 - Record in Rel [11,1,A - 11,2,B] Utente B, nuovo record Prova con id=11 - Record in Rel [11,2,B - 11,3,C] L'utente A salva per primo, e tutto avviene correttamente, rispettando id e tutto il resto. Quando l'utente B salva si ha che il suo record Prova avrà id=12 nel DB. Mentre i suoi record di Rel vengono inseriti, ma in relazione al record Prova inserito dall'utente A.
Non ho ancora provato la soluzione che mi hai proposto, quella relativa alla gestione dei campi Id settando AutoIncrement = true, AutoIncrementSeed = -1 AutoincrementStep = -1.
Come te, anche io ho dubbi sul corretto funzionamento, o megli della super intelligenza del Binding, altrimenti l'avrebbe già dimostrata.
Io una soluzione l'ho già implementata, e cioè, ogni volta che utente ha intenzione di creare un nuovo record in Prova, la crezione non avviene solo in locale, ma anche sun DB, inserendo il record e prelevando il nuovo Id. Così facendo ogni utente ha un id del proprio record Prova univoco, e gli inserimenti vengono effettuati correttamente.
Secondo è una soluzione corretta? |
|
| Sabrina |
|
|
 Posts:4
 |
| 24 mar 2009 13.47 |
|
Spesso è importante confrontarsi su alcune tecniche, così facendo si può capire se è una tecnica fattibile o meno. Mi fa molto piacere sapere che la soluzione, "figlia della notte", sia già da te utilizzata, ciò mi rende più sicuro nell'adottarla.
Grazie. |
|
|
|
|
 Posts:435
 |
| 26 mar 2009 16.20 |
|
e se poi l'utente ci ripensa e non inserisce il record ? Ti rimangono dei "buchi" di numerazione, ti va bene lo stesso ? tieni conto che i wizard sono una gran bella cosa, fai una form con dati master-slave in meno di un minuto, ma se prevedi di fare inserimento / modifica e' meglio fare le cose a mano. IMHO. Max. Il giorno 24 marzo 2009 11.38, <form>s@dotnetwork.it> ha scritto: > [image: www.dotnetwork.it] <http://www.dotnetwork.it> > > RE: ADO .Net 2.0 e tabelle in relazione > Forum: Windows Forms Applications - Inviato da: skugnizzo78 in data 24 > mar 2009 10.38 > > Ciao Sabrina, grazie 1000 per l'interessamento. > Nonostante sia contorta la mia espozione del problema, almeno da te, sono > stato compreso. > > Per quanto riguarda la generazione degli id in automatico, il tutto avviene > correttamente, con un singolo utente. > I problemi nascono in multiutenza. > Ti faccio un esempio > Utente A, nuovo record Prova con id=11 - Record in Rel [11,1,A - 11,2,B] > Utente B, nuovo record Prova con id=11 - Record in Rel [11,2,B - 11,3,C] > L'utente A salva per primo, e tutto avviene correttamente, rispettando id e > tutto il resto. > Quando l'utente B salva si ha che il suo record Prova avrà id=12 nel DB. > Mentre i suoi record di Rel vengono inseriti, ma in relazione al record > Prova inserito dall'utente A. > > Non ho ancora provato la soluzione che mi hai proposto, quella relativa > alla gestione dei campi Id settando AutoIncrement = true, AutoIncrementSeed > = -1 AutoincrementStep = -1. > > Come te, anche io ho dubbi sul corretto funzionamento, o megli della super > intelligenza del Binding, altrimenti l'avrebbe già dimostrata. > > Io una soluzione l'ho già implementata, e cioè, ogni volta che utente ha > intenzione di creare un nuovo record in Prova, la crezione non avviene solo > in locale, ma anche sun DB, inserendo il record e prelevando il nuovo Id. > Così facendo ogni utente ha un id del proprio record Prova univoco, e gli > inserimenti vengono effettuati correttamente. > > Secondo è una soluzione corretta? > |
|
|
|
|
 Posts:4
 |
| 23 mag 2009 01.09 |
|
Ciao a tutti...avevo scritto un post lunghissimo ma purtroppo non è stata salvato...non lo riscrivo, ma faccio una sintesi (mannaggia era dettagliato). Cmq, ritornando al problema, ho sperimentato una nuova tecnica rappresentata dal seguente codice che viene eseguito quando si inserisce un nuovo record master. Questa volta la relazione è Persano-Frequenza, dove per frequenza intendo n corsi che la persona segue. Persona[Id,Cognome,Nome] Frequenza[IdPersona-Corso] ...click su salva Dim nuovaPersona As Prova2DataSet.PersonaRow nuovaPersona = CType(PersonaBindingSource.Current.row, Prova2DataSet.PersonaRow) Me.Validate() PersonaBindingSource.SuspendBinding() Me.PersonaBindingSource.EndEdit() Me.FrequenzeBindingSource.EndEdit() Me.PersonaTableAdapter.Update(Me.Prova2DataSet.Persona) Dim nuova As Prova2DataSet.FrequenzeRow For Each z As DataRowView In FKFrequenzePersonaBindingSource.List nuova = CType(z.Row, Prova2DataSet.FrequenzeRow) nuova.SetParentRow(nuovaPersona) '<-----------Ecco Next Me.FrequenzeTableAdapter.Update(Me.Prova2DataSet.Frequenze) PersonaBindingSource.ResumeBinding() PersonaBindingSource.MoveLast() Con l'istruzione segnalata faccio si che i record frequenza (IdPersona,Corso), saranno composti da (NuovoIdPersona,NomeCorso) Il NuovoIdPersona è data automaticamente in quento per il DataTable Persona è stato impostato AutoIncrementSeed=-1 e AutoIncrementStep=-1 sul campo Id. L'intendo è quello di avere feedback si a positivi che negativi, con lo scopo di migliorare la tecnica. |
|
|
|
|
| Non sei autorizzato ad inviare una risposta. |
|
Active Forums 4.1
|
|
|