Uso OleDbDataAdapter e OleDbCommandBuilder per riempire l'oggetto DataSet con il contenuto del database e quindi aggiornare il database in base alle modifiche apportate al DataSet. Il problema è che ottengo l'eccezione: "Violazione della concorrenza: il UpdateCommand ha influenzato 0 dei 1 record previsti". Ho trovato una spiegazione di questo errore:Ottiene i comandi SQL generati da OleDbCommandBuilder
Because a record could have been modified after it was returned from the SELECT statement, but before the UPDATE or DELETE statement is issued, the automatically generated UPDATE or DELETE statement contains a WHERE clause, specifying that a row is only updated if it contains all original values and has not been deleted from the data source. Where an automatically generated update attempts to update a row that has been deleted or that does not contain the original values found in the DataSet, the command does not affect any records, and a DBConcurrencyException is thrown.
Ciò significa che automaticamente generato comando UPDATE influenzato 0 righe nel database. Lavoro con il database paradosso (db-file) e nessuno lo cambia tranne me. Immagino che il mio programma cambi la stessa riga due volte da qualche parte. Volevo eseguire il debug del mio programma eseguendo manualmente tutte le query generate e trovando quale non influenza alcuna riga (perché in realtà sono abbastanza sicuro che tutte le modifiche vengano apportate una sola volta e che il bug sia da qualche altra parte))). È possibile eseguire manualmente i comandi generati automaticamente?
Il mio codice è troppo grande e complicato per postare qui ma in genere funziona così (ho fatto un progetto di lavoro e ha preso da lì)
using System;
using System.Data;
using System.Windows.Forms;
using System.Data.OleDb;
namespace OleDBCommandBuilder
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
string cs = @"Provider=Microsoft.Jet.OLEDB.4.0;";
cs += @"Data Source=C:\FOLDER\1\SPR_KMZ\;";
cs += @"Extended Properties=Paradox 5.x;";
OleDbConnection Connection = new OleDbConnection();
Connection.ConnectionString = cs;
try
{ Connection.Open(); }
catch (Exception ex)
{ MessageBox.Show("Error openning database! " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); Environment.Exit(0); }
string SQLQuery = "SELECT * FROM SPR_KMZ WHERE REZ<>0";
DataSet SPR_KMZ = new DataSet();
OleDbDataAdapter DataAdapter = new OleDbDataAdapter();
DataAdapter.SelectCommand = new OleDbCommand(SQLQuery, Connection);
OleDbCommandBuilder builder = new OleDbCommandBuilder(DataAdapter);
try
{
DataAdapter.Fill(SPR_KMZ);
}
catch (Exception ex)
{
System.Windows.Forms.MessageBox.Show(String.Format("Error \n{0}\n{1}", ex.Message, SQLQuery));
Environment.Exit(0);
}
DataRow[] SPR_KMZ_rows = SPR_KMZ.Tables[0].Select("Fkmz=10000912 AND REZ=1");
foreach (DataRow SPR_KMZ_row in SPR_KMZ_rows)
{
SPR_KMZ_row["DN"] = Convert.ToDateTime("30.12.1899");//26.12.2008
SPR_KMZ_row["Price"] = Convert.ToDouble(0);//168,92
}
DataAdapter.Update(SPR_KMZ);
System.Windows.Forms.MessageBox.Show("Success!");
Environment.Exit(0);
}
}
}
P.S. Precedentemente ha aggiornato il database senza eccezione di concorrenza, ma dopo molte modifiche (ho commentato la riga "DataAdapter.Update (SPR_KMZ);" per un lungo periodo di tempo per il debug del motivo, quindi non so quando è iniziato esattamente questo errore lancio)
PSS non ci sono inserimenti o eliminazioni nel mio codice, solo gli aggiornamenti ...
< <UPDATE> >
che ho trovato quello che era il problema: se il campo "DN" ha un valore NULL poi dopo averlo cambiato, l'istruzione UPDATE generata automaticamente non influisce su nulla, ovviamente perché "DN" è contenuto in una chiave primaria e il builder del comando non si aspettava che il campo della chiave primaria avesse valori NULL (chi avrebbe mai voluto)), non sorprende questo motore si chiama "Paradox")))
ecco perché in
CommandBuilder.GetUpdateCommand().CommandText
in cui la clausola per il campo "DN" c'era questo tipo di modello:
... WHERE ((REZ = ?) AND (DN = ?) AND ...
mentre i campi Null vengono descritti in questo modo:
... AND ((? = 1 AND Price IS NULL) OR (Price = ?)) AND ((? = 1 AND Nmed IS NULL) OR (Nmed = ?)) AND ...
P.S.S.S. Ehi, posso provare a impostare UpdateCommand manualmente per risolvere il problema!))
C'è qualche possibilità di includere il codice che si sta utilizzando? –
Ricerca di un'istruzione di inserimento mancante o di un'istruzione di eliminazione. È possibile ridurre il problema riducendo la quantità di mutazioni DataSet? –