Problema con aggiornamento colonna in db

di il
15 risposte

Problema con aggiornamento colonna in db

Salve
ho un problema di aggiornamento di una colonna di un db.

ho il seguente codice:

db = new ProvaT();
			var query1 = from x1 in db.NOMI
						 join x2 in db.A on x1.Nome equals x2.Nome
						 join x3 in db.B on x1.Cognome equals x3.Cognome
						 join x4 in db.C on x3.Referente equals x4.Destinatario
						 join x5 in db.D on x4.Registrazione equals x5.Registrazione
						 where x1.Status == 1
						 select x1;
						 
						 
			foreach (NOMI  ord in query1)

			{
				ord.Stato = 2;
				//Imposto Anno Protocollo
				int year = localDate1.Year;
				short AnnoCon = Convert.ToInt16(year);
				ord.Anno = AnnoCon;
				//Imposto Data Protocollo
				string s1 = localDate1.ToString("dd-MM-yyyy");
				DateTime dtReg = DateTime.Parse(s1);
				ord.DataReg = dtReg;


				ord.DataUltimaModifica = dtReg;

			
				var MassimoNumero=
											  (from sz in db.NOMI
											   select sz).Max(sz => sz.Numero);
				
					ord.Numero = MassimoNumero + 1;
			

				// Insert any additional changes to column values.
			}

			//Submit the changes to the database.
			try
			{
				db.SaveChanges();
				MessageBox.Show("Protocollo avvenuto", "Esito", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
			}
			catch (Exception)
			{
				Console.WriteLine();
				MessageBox.Show("Protocollo non avvenuto", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
				// Provide for exceptions.
			}

Nella tabella mi aggiorna tutti i campi
ma "ord.Numero" mi prende solo il MassimoNumero e me lo ricopia uguale per tutte le righe.

Che sbaglio?

15 Risposte

  • Re: Problema con aggiornamento colonna in db

    Quando vai a recuperare il numero massimo, il database non è stato ancora aggiornato, cosa che fai successivamente tramite SaveChanges(), quindi il valore di riferimento sarà sempre lo stesso.

    Per risolvere, potresti salvare a ogni modifica di record, ma sarebbe altamente inefficiente.

    Il mio consiglio è quello di 1) recuperare il valore iniziale del massimo solo una volta e prima del ciclo, 2) salvarlo in una variabile, 3) incrementare la variabile stessa (senza andare a rileggere dal DB) e 4) assegnare nel ciclo il valore incrementante a ogni record, infine 5) salvare tutte le modifiche con SaveChanges() al termine del ciclo, aggiornando i record modificati.

    In pratica, il valore del massimo non viene determinato in continuazione leggendo dal DB, per scoprire che di volta in volta si incrementa di una unità, ma viene letto all'inizio e incrementato a ogni assegnazione, in memoria.

    Ciao!
  • Re: Problema con aggiornamento colonna in db

    Dovrei fare in questo modo:
    
    db = new ProvaT();
    			var MassimoNumero=
    											  (from sz in db.NOMI
    											   select sz).Max(sz => sz.Numero);
    			Var Max=MassimoNumero+1
    			var query1 = from x1 in db.NOMI
    						 join x2 in db.A on x1.Nome equals x2.Nome
    						 join x3 in db.B on x1.Cognome equals x3.Cognome
    						 join x4 in db.C on x3.Referente equals x4.Destinatario
    						 join x5 in db.D on x4.Registrazione equals x5.Registrazione
    						 where x1.Status == 1
    						 select x1;
    						 
    						 
    			foreach (NOMI  ord in query1)
    
    			{
    				ord.Stato = 2;
    				//Imposto Anno Protocollo
    				int year = localDate1.Year;
    				short AnnoCon = Convert.ToInt16(year);
    				ord.Anno = AnnoCon;
    				//Imposto Data Protocollo
    				string s1 = localDate1.ToString("dd-MM-yyyy");
    				DateTime dtReg = DateTime.Parse(s1);
    				ord.DataReg = dtReg;
    
    
    				ord.DataUltimaModifica = dtReg;
    
    			
    				
    				
    			       ord.Numero = Max;
    			
    
    				// Insert any additional changes to column values.
    			}
    
    			//Submit the changes to the database.
    			try
    			{
    				db.SaveChanges();
    				MessageBox.Show("Protocollo avvenuto", "Esito", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    			}
    			catch (Exception)
    			{
    				Console.WriteLine();
    				MessageBox.Show("Protocollo non avvenuto", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
    				// Provide for exceptions.
    			}
    
    
    ?
  • Re: Problema con aggiornamento colonna in db

    No, la variabile Max deve essere ablitata (incrementata di 1) dentro al ciclo.
  • Re: Problema con aggiornamento colonna in db

    
    
    db = new ProvaT();
    			var MassimoNumero=
    											  (from sz in db.NOMI
    											   select sz).Max(sz => sz.Numero);
    			
    			var query1 = from x1 in db.NOMI
    						 join x2 in db.A on x1.Nome equals x2.Nome
    						 join x3 in db.B on x1.Cognome equals x3.Cognome
    						 join x4 in db.C on x3.Referente equals x4.Destinatario
    						 join x5 in db.D on x4.Registrazione equals x5.Registrazione
    						 where x1.Status == 1
    						 select x1;
    						 
    						 
    			foreach (NOMI  ord in query1)
    
    			{
    			        Var Max=MassimoNumero+1
    				ord.Stato = 2;
    				//Imposto Anno Protocollo
    				int year = localDate1.Year;
    				short AnnoCon = Convert.ToInt16(year);
    				ord.Anno = AnnoCon;
    				//Imposto Data Protocollo
    				string s1 = localDate1.ToString("dd-MM-yyyy");
    				DateTime dtReg = DateTime.Parse(s1);
    				ord.DataReg = dtReg;
    
    
    				ord.DataUltimaModifica = dtReg;
    
    			
    				
    				
    			       ord.Numero = Max;
    			
    
    				// Insert any additional changes to column values.
    			}
    
    			//Submit the changes to the database.
    			try
    			{
    				db.SaveChanges();
    				MessageBox.Show("Protocollo avvenuto", "Esito", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
    			}
    			catch (Exception)
    			{
    				Console.WriteLine();
    				MessageBox.Show("Protocollo non avvenuto", "Errore", MessageBoxButtons.OK, MessageBoxIcon.Error);
    				// Provide for exceptions.
    			}
    
    
    
    
    Ho fatto in questo modo ma il Numero è sempre lo stesso per ogni riga
  • Re: Problema con aggiornamento colonna in db

    Se fai il debug capisci subito dove sta il problema
  • Re: Problema con aggiornamento colonna in db

    posa ha scritto:


    Ho fatto in questo modo ma il Numero è sempre lo stesso per ogni riga
    Sì, ma questo non è un problema di accesso al DB o aggiornamento dei dati, ma di pura logica.

    Nel tuo codice hai determinato il valore di MassimoNumero. Supponiamo sia 10.

    Nel tuo ciclo stai assegnando alla variabile Max (che poi usi per valorizzare la proprietà Numero) il valore di MassimoNumero+1, quindi il valore 11 nel nostro esempio.
    All'interno del ciclo, MassimoNumero non viene mai incrementato, quindi rimarrà costante a 10, pertanto Max rimarrà sempre uguale a 11.

    A ogni iterazione del ciclo quella variabile Max, partendo da MassimoNumero, deve incrementarsi di 1 unità.

    Come ha giustamente precisato @sspintux, fai il debug passo per passo del tuo codice, e scoprirai subito qual è il problema.

    Ciao!
  • Re: Problema con aggiornamento colonna in db

    Salve, scusatemi ho fatto il debug e vedo che scrive sempre la stessa cifra. Ora però non riesco ad andare avanti . Datemi un suggerimento ... scusatemi, ma immagino che sia qualcosa di così banale ma purtroppo sto
  • Re: Problema con aggiornamento colonna in db

    Mi riesce difficile pensare che chi scrive query linq si blocchi davanti un problema simile;

    riguardalo a mente fresca rileggendoti i consigli di alka
    e vedrai che ti darei le martellate sugli 'stinchi' da solo
    per quanto è banale la soluzione

  • Re: Problema con aggiornamento colonna in db

    posa ha scritto:


    Salve, scusatemi ho fatto il debug e vedo che scrive sempre la stessa cifra.
    Appunto. Se vuoi che scriva una cifra diversa, incrementa quella variabile per ogni record, quindi per ogni iterazione del ciclo e il gioco è fatto.
    Se non risolvi una banalità simile, la vedo dura su scenari che si prospetteranno in seguito e saranno ben più complessi.
  • Re: Problema con aggiornamento colonna in db

    Scusatemi se aggiungo
    
    			 
    			foreach (NOMI  ord in query1)
    
    			{
    			        Var Max=MassimoNumero+1
    				ord.Stato = 2;
    				//Imposto Anno Protocollo
    				int year = localDate1.Year;
    				short AnnoCon = Convert.ToInt16(year);
    				ord.Anno = AnnoCon;
    				//Imposto Data Protocollo
    				string s1 = localDate1.ToString("dd-MM-yyyy");
    				DateTime dtReg = DateTime.Parse(s1);
    				ord.DataReg = dtReg;
    
    
    				ord.DataUltimaModifica = dtReg;
    
    			
    				int counter = Max;
    				while (counter < 1000)
    				{
    					   ord.Numero = counter;
    					counter++;
    				}
    				
    			     
    			
    
    				
    			}
    
    scrive in tutte e righe il valore 999 avendo come valore max 102;
  • Re: Problema con aggiornamento colonna in db

    posa ha scritto:


    Scusatemi se aggiungo
    [...]
    scrive in tutte e righe il valore 999 avendo come valore max 102;
    Adesso fai questo esercizio: prendi il tuo codice e sopra ogni riga, in particolare nella parte finale di assegnazione a ord.Numero, inserisci un commento che descrive cosa fa di preciso quell'istruzione.

    Se il problema non ti appare, lancia il programma in debug ed eseguilo passo per passo e controlla il valore delle variabili a ogni istruzione, accertandoti che quello che viene eseguito sia esattamente ciò che hai scritto nel commento.

    Fatto questo, se il problema non ti appare ancora chiaro, confido che tu non faccia questa attività come mestiere...
  • Re: Problema con aggiornamento colonna in db

    Purtroppo, non faccio questo di mestiere,
    capisco che possa essere banale ma non ne riesco ad uscire,
    se qualcuno mi può aiutare lo accetto, altrimenti pazienza, vi ringrazio lo stesso.
  • Re: Problema con aggiornamento colonna in db

    posa ha scritto:


    capisco che possa essere banale ma non ne riesco ad uscire
    Ti ho dato una indicazione.

    posa ha scritto:


    se qualcuno mi può aiutare lo accetto, altrimenti pazienza, vi ringrazio lo stesso.
    Se cerchi aiuti, te ne sono stati dati, ma non approfondisci, non chiedi e vai a casaccio, postando modifiche al codice fatte per tentativi e non ragionando.

    Se vuoi che si faccia il lavoro al posto tuo, no, anche perché ammettendo di risolverla così questa volta, lo si dovrà fare lo stesso anche dopo, se l'approccio non cambia.
  • Re: Problema con aggiornamento colonna in db

    .... doppio invio
Devi accedere o registrarti per scrivere nel forum
15 risposte