Dim newRow As wilsysFixedDataSet.FormulaRow =
blend.formulaDataSet.Formula.NewFormulaRow
在设置新行的所有属性之后的几行......
Console.WriteLine("Current Row State Before Added: {0}", newRow.RowState)
blend.formulaDataSet.Formula.AddFormulaRow(newRow)
Console.WriteLine("Current Row State After Added: {0}", newRow.RowState)
Console.WriteLine(blend.formulaDataSet.Formula.Contains(newRow))
blend.formulaTableAdapter.Update(blend.formulaDataSet.Formula)
我在尝试使用Form创建新的Formula记录时遇到问题,将该行添加到FormulaDataTable,然后使用FormulaDataTable作为参数调用FormulaDataSetTableAdapter.update()方法。我确保行的id属性不存在,并且设置了所有其他必需的属性,并且该行在dataTable中不存在。 出于某些STRANGE原因,TableAdapter选择调用UPDATECOMMAND,如下面的堆栈跟踪中所示,它应该插入。 为什么这个以及如何让它用新行调用适当的方法。
这里我正在打印到控制台: - 在将newRow添加到DataTable之前的newRow.RowState - 将newRow添加到DataTable后的newRow.RowState - DataTable.Contains(newRow) - 列出项目
Current Row State Before Added: Detached
Current Row State After Added: Added
True
下面我在执行时收到以下StackTrace DataSetTableAdapter.update(FormulaDataTable):
System.Data.DBConcurrencyException: Concurrency violation: the UpdateCommand affected 0 of the expected 1 records.
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 RepackWPF.wilsysFixedDataSetTableAdapters.FormulaTableAdapter.Update(FormulaDataTable dataTable)
at RepackWPF.NewFormDialog.NewFormula()
答案 0 :(得分:0)
原来我能够通过"刷新"来解决这个问题。通过调用
更改FormulaDataSet(包含tableadapters的主数据集)上的记录FormulaDataSet.AcceptChanges()
方法。我必须在FormulaDataSet上的每次更新调用之前调用它。 这将RowState从Modified设置为Unchanged,并允许事务通过。