2012-09-11 70 views
0

我使用来自表A的数据填充dataGridView,该数据属于MySQL数据库表。在插入新数据或修改DataTable A的数据后调用SaveChangestoDb(string TableName)方法时 - 将更改保存到数据库,但是当我将表A中批准的DataRows转移到表B时,然后从表A中删除批准的行...保存对表A所做的更改失败。它不会抛出任何例外。将DataSet更改保存到MYSQL数据库表的问题

我使用BindingSource将表A绑定到dataGridViewCommandBuilder以获取有关DataAdapter的更新。

这里是我的代码:

private const string ConnectionString = 
     "server=*****.**;Port=****;database=**;username=****;password=*****;pooling=false;"; 

    private DataSet _localDatabaseCopy; 
    private MySqlDataAdapter _myDataAdapter; 

    private void Form1_Load(object sender, System.EventArgs e) 
    { 
     InitializeLocalDatabaseCopy(); 
     InitializeDataGridView(); 
     dataGridView1.AllowUserToAddRows = false; 
    } 

    /// <summary> 
    /// Binds the DataGridView to the BindingSource and load the data from the database. 
    /// </summary> 

    private void InitializeDataGridView() 
    { 
     DataTable dataTable = _localDatabaseCopy.Tables[Resources.WorkingDataDatabaseTableName]; 
     dataGridView1.DataSource = new BindingSource { DataSource = dataTable }; 
     dataGridView1.MultiSelect = true; 
     dataTable.Columns[Resources.ColumnName_IDNr].AutoIncrement = true; 
     dataTable.Columns[Resources.ColumnName_IDNr].AutoIncrementSeed = -1; 
     dataTable.Columns[Resources.ColumnName_IDNr].AutoIncrementStep = -1; 


    } 
    /// <summary> 
    /// Fills the _myDataAdapter DataAdapter with the workingData & approvedData DataTables and adds the 2 DataTables to the _localDatabaseCopy DataSet. 
    /// </summary> 
    private void InitializeLocalDatabaseCopy() 
    { 
     _localDatabaseCopy = new DataSet(); 
     DataTable workingData = new DataTable(Resources.WorkingDataDatabaseTableName); 
     DataTable approvedData = new DataTable(Resources.ApprovedDataDatabaseTableName); 
     using (MySqlConnection connection = new MySqlConnection(ConnectionString)) 
     { 
      _myDataAdapter = new MySqlDataAdapter(string.Format("select * from {0}", Resources.WorkingDataDatabaseTableName), connection); 
      _myDataAdapter.Fill(workingData); 
      _myDataAdapter.SelectCommand.CommandText = string.Format("select * from {0}", Resources.ApprovedDataDatabaseTableName); 
      _myDataAdapter.Fill(approvedData); 
     } 

     _localDatabaseCopy.Tables.Add(workingData); 
     _localDatabaseCopy.Tables.Add(approvedData); 
    } 



    private void SaveChangesToDb(string tableName) 
    { 
     MySqlCommandBuilder builder = new MySqlCommandBuilder(_myDataAdapter); 

     _myDataAdapter.SelectCommand.CommandText = String.Format("select * from {0}", tableName); 
     _myDataAdapter.UpdateCommand = builder.GetUpdateCommand(); 
     _myDataAdapter.DeleteCommand = builder.GetDeleteCommand(); 
     _myDataAdapter.InsertCommand = builder.GetInsertCommand(); 

     DataTable deletedRecords = _localDatabaseCopy.Tables[tableName].GetChanges(DataRowState.Deleted); 
     DataTable modifiedRecords = _localDatabaseCopy.Tables[tableName].GetChanges(DataRowState.Modified); 
     DataTable addedRecords = _localDatabaseCopy.Tables[tableName].GetChanges(DataRowState.Added); 
     try 
     { 
      if (deletedRecords != null) 
       _myDataAdapter.Update(deletedRecords); 
      if (modifiedRecords != null) 
       _myDataAdapter.Update(modifiedRecords); 
      if (addedRecords != null) 
       _myDataAdapter.Update(addedRecords); 

      _localDatabaseCopy.AcceptChanges(); 

     } 
     catch (Exception exception) 
     { 
      MessageBox.Show(exception.Message); 
     } 
     finally 
     { 
      if (deletedRecords != null) 
       deletedRecords.Dispose(); 
      if (modifiedRecords != null) 
       modifiedRecords.Dispose(); 
      if (addedRecords != null) 
       addedRecords.Dispose(); 
     } 

    } 



    private void btnSave_Click(object sender, EventArgs e) 
    { 

     SaveChangesToDb(Resources.WorkingDataDatabaseTableName); 

    } 


    private void DeleteDataRows(DataRow[] rowsToDelete, string tableIndex) 
    { 
     foreach (DataRow row in rowsToDelete) 
      _localDatabaseCopy.Tables[tableIndex].Rows.Remove(row); 
    } 


    /// <summary> 
    /// Transfers the approved DataRows from the DataTable/DataGridview to the Approved Table in the MySql Database 
    /// </summary> 
    /// <param name="sender"></param> 
    /// <param name="e"></param> 
    private void btnTransferApproved_Click(object sender, EventArgs e) 
    { 
     SetWaitingCursor(); 

     TransferApprovedDataRows(); 
     DeleteTransferedRowsFromWorkingDataTable(); 
     SaveChangesToDb(Resources.WorkingDataDatabaseTableName); 

     SetDefaultCursor(); 
    } 

    private void DeleteTransferedRowsFromWorkingDataTable() 
    { 
     DataRow[] approvedRowsToDelete = _localDatabaseCopy.Tables[Resources.WorkingDataDatabaseTableName].Select("Approved = 1"); 
     DeleteDataRows(approvedRowsToDelete, Resources.WorkingDataDatabaseTableName); 

    } 

    private void TransferApprovedDataRows() 
    { 
     DataTable myTableCopy = _localDatabaseCopy.Tables[Resources.WorkingDataDatabaseTableName].Copy(); 
     DataRow[] approvedRows = myTableCopy.Select("Approved = 1"); 

     // if there are no rows which have been approved, quit 
     if (approvedRows.Any()) 
     { 
      foreach (DataRow row in approvedRows) 
      { 
       // checking if the row which is to be approved already exists in the approved-table 
       bool redundant = false; 
       foreach (
        DataRow approvedRow in _localDatabaseCopy.Tables[Resources.ApprovedDataDatabaseTableName].Rows) 
        redundant |= approvedRow[Resources.ColumnName_IDNr].ToString() == 
           row[Resources.ColumnName_IDNr].ToString(); 

       if (!redundant) 
        _localDatabaseCopy.Tables[Resources.ApprovedDataDatabaseTableName].Rows.Add(row.ItemArray); 
      } 
      // writing the changes back to the database, Approved Table 
      SaveChangesToDb(Resources.ApprovedDataDatabaseTableName); 
     } 

     if (!approvedRows.Any()) 
      return; 


    } 


} 

}

+0

我希望你在这里;-) – driis

+0

耶发布之前匿名用户/密码,我给了一个假密码:) – user1654847

回答

0

的问题是在你的DeleteDataRows方法。从表格中删除行不会将它们标记为删除,只是将它们从表格的内存中表示中删除。你需要调用DataRow.Delete

private void DeleteDataRows(DataRow[] rowsToDelete, string tableIndex) 
{ 
    foreach (DataRow row in rowsToDelete) 
     row.Delete(); 
} 
+0

谢谢你的提示!但现在我在SaveChangesToDb方法[调试模式]中得到一个异常= {“并发冲突:DeleteCommand影响了预期的1条记录中的0。”} – user1654847