Sto tentando di modificare DataTable
compilato da NpgsqlDataAdapter
. Dopo aver chiamato il metodo Fill()
, ho solo una riga in DataTable
. Poi ho cambiato il valore di una sola colonna e ho provato ad aggiornare come di seguito.Errore DBConcurrency durante l'aggiornamento tramite Dataadapter
Poi sto ottenendo questo errore:
DBConcurrencyException occured
Il mio codice è:
NpgsqlDataAdapter getAllData = new NpgsqlDataAdapter("SELECT sn,
code,product, unitprice, quantity, InvoiceNo, Date FROM stocktable WHERE Code='" + product + "'
ORDER BY EDate ASC", DatabaseConnectionpg);
DataTable ds1 = new DataTable();
ds1.Clear();
getAllData.Fill(ds1);
if (ds1.Rows.Count > 0)
{
ds1.Rows[0]["Quantity"] = qty;// calculated value
}
ds1 = ds1.GetChanges();
NpgsqlCommandBuilder cb = new NpgsqlCommandBuilder(getAllData);
//getAllData.RowUpdating += (sender2, e2) => { e2.Command.Parameters.Clear(); };
//cb.SetAllValues = false;
getAllData.DeleteCommand = cb.GetDeleteCommand();
getAllData.InsertCommand = cb.GetInsertCommand();
getAllData.UpdateCommand = cb.GetUpdateCommand();
int x = getAllData.Update(ds1);
if (x > 0)
{
ds1.AcceptChanges();
}
EDIT: Ho tre campi come chiavi primarie e sto solo chiamando due campi nell'istruzione select. È la causa dell'errore DBConcurrency
? Ma io sono in grado di aggiornare la tabella con le stesse (tre campi come chiave primaria) i parametri in SQL Server 2005.
UPDATE:
ho trovato la soluzione e la soluzione è che ho creato e usato secondo DataAdapter per aggiornare i dati. Ho usato getAllData (NpgSqlDataAdapter) per riempire tabella come
NpgsqlDataAdapter getAllData = new NpgsqlDataAdapter("SELECT
code,product, unitprice, quantity, InvoiceNo, Date FROM stocktable WHERE Code='" + product + "'
ORDER BY EDate ASC", DatabaseConnectionpg);
e ha anche creato adattatore prossimo per aggiornare come
NpgsqlDataAdapter updateadap= new NpgsqlDataAdapter("SELECT sn, quantity FROM stocktable WHERE Code='" + product + "'
ORDER BY EDate ASC", DatabaseConnectionpg);
NpgsqlCommandBuilder cb = new NpgsqlCommandBuilder(updateadap);
//getAllData.RowUpdating += (sender2, e2) => { e2.Command.Parameters.Clear(); };
//cb.SetAllValues = false;
updateadap.DeleteCommand = cb.GetDeleteCommand();
updateadap.InsertCommand = cb.GetInsertCommand();
updateadap.UpdateCommand = cb.GetUpdateCommand();
int x = updateadap.Update(ds1);
if (x > 0)
{
......
}
ho provato un sacco e ha scoperto che NpgsqlDataAdapter ha avuto problemi con la colonna Codice . Quando l'ho usato, ha funzionato. DataType del codice della colonna è varchar. Non so perché questo stava accadendo. Qualcuno ha idea al riguardo?
puoi pubblicare lo schema esatto per tabella di magazzino (puoi farlo eseguendo '\ d stocktable' in psql)? Inoltre, qual è il tipo di variabile qty? Nota che può esserci solo una chiave primaria in una tabella PG, non tre (anche se puoi avere tutti gli indici che vuoi) –
Un'altra cosa che sarebbe di aiuto è il risultato della query che stai facendo (cioè i valori esatti) –