Problema con aggiornamento database: Violazione di concorrenza

lunedì 02 marzo 2009 - 17.16

Nycola Profilo | Newbie

Ciao a tutti,
ho fatto un'applicazione agganciata ad una tabella di un mdb; con i dati di questa tabella ho popolato un DataTable, dal quale poi ho creato un DataView:

dvClienti = new DataTable(dtClienti);

i dati del DataView vengono visualizzati in un DataGridView:

dgvClienti.DataSource = dvClienti;

Il problema che mi si presenta è il seguente: quando aggiungo una riga al DataTable, e poi salvo le modifiche con il comando "daClienti.Update(ds, dtClienti)", tutto funziona regolarmente e la nuova riga viene visualizzata nel DataGridView. Se però subito dopo modifico un valore nella nuova riga del DataGridView, e rieseguo l'aggiornamento del db, mi appare il seguente errore:

"Violazione di concorrenza: UpdateCommand ha modificato 0 dei 1 record previsti."

Qualcuno può aiutarmi? È una settimana che ci sto impazzendo...

Jeremy Profilo | Guru

Ciao Nicola.
Probabilmente, per qualche motivo, rimane aperta la connessione, e, usando il dataadapter,non dovrebbe succedere, in quanto, è lui stesso ad occuparsi dell'apertura e della chiusura della connessione.
L'errore è sicuramente dovuto al fatto che si tenta di accedere al Db con una connessione mentre ne è già in corso un'altra.

Il DataAdapter te lo ha creato il wizard di visualstudio? Potresti mostrare un pò più di codice?

Facci sapere....
Ciao

Nycola Profilo | Newbie

Ciao Jeremy... innanzitutto grazie per la risposta.
Il DataAtapter l'ho creato da codice. Provo a postare la parte interessata:

daClienti = new OleDbDataAdapter(stringaSql, cn1);
daClienti.SelectCommand.CommandText = stringaSql;
daClienti.Fill(ds, "Clienti");
dtClienti = ds.Tables["Clienti"];
dvClienti = new DataView(dtClienti);
dgvClienti.DataSource = dvClienti;

La funzione che aggiorna il database è questa:

private void AggiornaDatabase(OleDbDataAdapter pDa, string pTabella)
{
OleDbCommandBuilder cb = new OleDbCommandBuilder(pDa);
pDa.Update(ds, pTabella);
}

mentre al pulsante Salva ho abbinato questo codice:

private void btnSalva_Click(object sender, EventArgs e)
{
if (dtClienti.Rows.Count == 0)
return;

AggiornaDatabase(daClienti, "Clienti");
}

Jeremy Profilo | Guru

Ciao Nicola.
Così a occhio sembrerebbe tutto a posto....dovrei provarlo....a parte il fatto che il commandbuilder forse dovrebbe essere dichiarato prima di eseguire il Fill.....ma potrei sbagliarmi io.

Intanto prova a modificare il codice così:
private void AggiornaDatabase(ref OleDbDataAdapter pDa, ref string pTabella) { OleDbCommandBuilder cb = new OleDbCommandBuilder(pDa); pDa.Update(ds, pTabella); }
Se così risolvi poi ti spiego il perchè

Facci sapere...
Ciao

Nycola Profilo | Newbie

Non funziona nemmeno con le clausole ref... a forza di smanettarci ho risolto così:

private void AggiornaDatabase(OleDbDataAdapter pDa, string pTabella)
{
OleDbCommandBuilder cb = new OleDbCommandBuilder(pDa);
pDa.Update(ds, pTabella);

ds.Tables[pTabella].Clear();
pDa.Fill(ds, pTabella);
}

però, sinceramente, non ho capito la logica: in teoria non dovrebbe essere necessario svuotare e ricaricare la tabella, o sbaglio?

Jeremy Profilo | Guru

>però, sinceramente, non ho capito la logica: in teoria non dovrebbe essere necessario svuotare e ricaricare la tabella, o sbaglio?
Invece temo proprio di sì ..... però, se vuoi fare un'altra prova, dopo aver eseguito l'apdate, provare a eseguire anche un AcceptChanges .....
Facci sapere...
Ciao

Nycola Profilo | Newbie

l'AcceptChanges l'avevo già provato, ma non risolve il problema

evilripper Profilo | Newbie

grandissimo avevo lo stesso problema!!
cmq ho individuato quando va in autoconcorrenza, cioe' va in conflitto con i dati in cache e quelli sul db se elimino un rekord e ne aggiungo (tutto questo in cache) mi da sempre errore di concorrenza facendo come tu suggerisci non me lo fa piu'!!
boh
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5