[mysql] Problema con DataAdapter

domenica 10 maggio 2009 - 18.28

kenshin Profilo | Newbie

Ciao a tutti,

ho una piccola applicazione in C# che usa SqlExpress 2008 e per studio la sto portando su Mysql 5.1.30, usando il Mysql Connector/Net 5.2.

Lo scenario è semplice:
1) ho creato la tabella sul mysql e l'ho testata manualmente
2) utilizzando un DataAdapter (da) popolo un DataSet (ds) con una tabella (spese).
3) popolo un DataGridView (dgv) con il contenuto della tabella: dgv.DataSource = ds.Tables["spese"];
4) modifico il contenuto del DataGridView alterando le righe ed inserendone di nuove

...fin qui tutto bene, il problema nasce quando voglio allineare il db al DataGridView.
Per farlo uso la seguente istruzione: da.Update(ds, "spese");

Come risultato ottengo sempre il seguente errore: "InvalidOperationException", "Update richiede un UpdateCommand valido se l'insieme DataRow viene passato con righe modificate." o "Update richiede un InsertCommand valido se l'insieme DataRow viene passato con righe nuove."
Più in dettaglio:

System.InvalidOperationException non è stata gestita
Message="Update richiede un UpdateCommand valido se l'insieme DataRow viene passato con righe modificate."
Source="System.Data"
StackTrace:
in System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
in System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
in System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)
in System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable dataTable, DataTableMapping tableMapping)
in System.Data.Common.DbDataAdapter.Update(DataSet dataSet, String srcTable)
in FamilyManager.Form1.Salva_Click(Object sender, EventArgs e) in D:\Visual Studio 2008 Projects\FamilyManager\FamilyManager\Form1.cs:riga 506
in System.Windows.Forms.Control.OnClick(EventArgs e)
in System.Windows.Forms.Button.OnClick(EventArgs e)
in System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
in System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
in System.Windows.Forms.Control.WndProc(Message& m)
in System.Windows.Forms.ButtonBase.WndProc(Message& m)
in System.Windows.Forms.Button.WndProc(Message& m)
in System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
in System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
in System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
in System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
in System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
in System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
in System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
in System.Windows.Forms.Application.Run(Form mainForm)
in FamilyManager.Program.Main() in D:\Visual Studio 2008 Projects\FamilyManager\FamilyManager\Program.cs:riga 18
in System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
in System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
in Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
in System.Threading.ThreadHelper.ThreadStart_Context(Object state)
in System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
in System.Threading.ThreadHelper.ThreadStart()
InnerException:

Le query in MySql sono corrette poichè ho provato ad eseguirle manualmente (fuori dal DataAdapter) ed ottengo il risultato corretto, inoltre ho provato a crearle con un CommandBuilder, ma il risultato non è cambiato.

Posso aggiungere che l'algoritmo è corretto poichè con MSSQL funziona tutto correttamente... non riesco proprio ad uscirne!

Potete darmi qualche suggerimento?

Grazie in anticipo!!!

Kenshin

Jeremy Profilo | Guru

Ciao Stefano.

Il problema, probabilmente, si riduce solo ad un uso sbagliato del commanbuilder, ma per questo, dovremmo vedere il codice che hai scritto.
Fatto sta, che l'errore lo ricevi di sicuro e semplicemente perchè non sono istanziati i command di Insert,Delete,Update.

In questo caso, le strade sono due:
1. O li istanzi e li valorizzi tu a manina .
2. O, più semplicemente, lasci fare tutto al commandbuilder, usandolo correttamente, quindi, assicurati di assegnare il dataadapter al commandbuilder prima di eseguire il Fill ed assicurati che nella tabella ci sia un campo con chiave primaria.

Nel prossimo post, mostra un pò di codice sul quale possiamo ragionare.

Facci sapere...
Ciao




kenshin Profilo | Newbie

Ciao Jeremy,

ripulendo il codice per includerlo nel post mi sono accorto di un errore talmente grande da non riuscire a vederlo: per l'update stavo utilizzando un altro dataadapter non inizializzato.

Corretto questo erroraccio vergognoso ora tutto funziona correttamente.

Mi scuso per il post poco furbo.

Grazie mille per la risposta!

Stefano
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