Hola gente, estoy tratando de hacer 2 way databinding con 1 datagridview
(winforms, con vs 2008 express y sql 2008 express), tengo una tabla
"tarea" que sólo tiene id (con identity seed) y descripción.
Usé el ejemplo de la ayuda del vs....
El código para hacer el binding es este:
private void GetData() {
SqlConnection cnn = new
SqlConnection("Server=(local)\\SQLEXPRESS;initial
catalog=db;Trusted_Connection=true;");
SqlCommand command = new SqlCommand("select * from tarea", cnn);
SqlDataAdapter adapter = new SqlDataAdapter(command);
SqlCommandBuilder builder = new SqlCommandBuilder(adapter);
DataTable table = new DataTable();
table.Locale =
System.Globalization.CultureInfo.InvariantCulture;
adapter.Fill(table);
bindingSource1.DataSource = table;
}
Los datos los muestra bien en la datagridview, pero después de agregar
alguna fila cuando quiero hacer
dataAdapter.Update((DataTable)bindingSource1.DataSource);
me da InvalidOperationException: "Update requires a valid InsertCommand
when passed DataRow collection with new rows." (abajo pongo todo)
(y lo mismo pasa cuando modifico con un mensaje casi igual)
El sqlbuilder parece estar funcionando bien porque si hago un
builder.GetInsertCommand(); me da un command con esto:
"INSERT INTO [tarea] ([descripcion]) VALUES (@p1)"
(el id es un identity con seed)
Alguien tiene idea cual es el problema o un link a un ejemplo de 2 way
databinding que funcione ?
Gracias,
Quique
System.InvalidOperationException was unhandled
Message="Update requires a valid InsertCommand when passed DataRow
collection with new rows."
Source="System.Data"
StackTrace:
at
System.Data.Common.DbDataAdapter.UpdatedRowStatusErrors(RowUpdatedEventArgs
rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
at
System.Data.Common.DbDataAdapter.UpdatedRowStatus(RowUpdatedEventArgs
rowUpdatedEvent, BatchCommandInfo[] batchCommands, Int32 commandCount)
at System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows,
DataTableMapping tableMapping)
at System.Data.Common.DbDataAdapter.UpdateFromDataTable(DataTable
dataTable, DataTableMapping tableMapping)
at System.Data.Common.DbDataAdapter.Update(DataTable dataTable)
at GestionTaller.TareasForm.butCerrar_Click(Object sender,
EventArgs e) in
C:\desarrollo\GestionTaller\GestionTaller\TareasForm.cs:line 90
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m,
MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at
System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at
System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr
hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG&
msg)
at
System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32
dwComponentID, Int32 reason, Int32 pvLoopData)
at
System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32
reason, ApplicationContext context)
at
System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32
reason, ApplicationContext context)
at System.Windows.Forms.Application.Run(Form mainForm)
at GestionTaller.Program.Main() in
C:\desarrollo\GestionTaller\GestionTaller\Program.cs:line 18
at System.AppDomain._nExecuteAssembly(Assembly assembly, String[]
args)
at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence
assemblySecurity, String[] args)
at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
at System.Threading.ExecutionContext.Run(ExecutionContext
executionContext, ContextCallback callback, Object state)
at System.Threading.ThreadHelper.ThreadStart()
InnerException: