将数据集更改保存到MYSQL数据库表时出现问题

将数据集更改保存到MYSQL数据库表时出现问题,mysql,dataset,updates,dataadapter,Mysql,Dataset,Updates,Dataadapter,我正在用表a中的数据填充dataGridView,该表属于MySQL数据库表。在插入新数据或修改数据表A的数据后调用SaveChangestoDb(string TableName)方法时-更改将保存到数据库中,但当我将已批准的DataRows从表A传输到表B,然后从表A删除已批准的行时。。。保存对表A所做的更改失败。它不会抛出任何异常 我使用BindingSource将表A绑定到dataGridView上,并使用CommandBuilder获取DataAdapter上的更新 这是我的密码:

我正在用表a中的数据填充
dataGridView
,该表属于
MySQL
数据库表。在插入新数据或修改数据表A的数据后调用
SaveChangestoDb(string TableName)
方法时-更改将保存到数据库中,但当我将已批准的
DataRows
从表A传输到表B,然后从表A删除已批准的行时。。。保存对表A所做的更改失败。它不会抛出任何异常

我使用
BindingSource
将表A绑定到
dataGridView
上,并使用
CommandBuilder
获取
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;


    }


}
私有常量字符串连接字符串=
“服务器=*****;端口=****;数据库=***;用户名=****;密码=****;池=false;”;
私有数据集\u localDatabaseCopy;
私有MySqlDataAdapter\u myDataAdapter;
私有void Form1_加载(对象发送方,System.EventArgs e)
{
初始化ElocalDatabaseCopy();
初始化为TagRidView();
dataGridView1.AllowUserToAddress=false;
}
/// 
///将DataGridView绑定到BindingSource并从数据库加载数据。
/// 
private void initializedTagRidView()
{
DataTable DataTable=_localDatabaseCopy.Tables[Resources.workingDatabaseTableName];
dataGridView1.DataSource=new BindingSource{DataSource=dataTable};
dataGridView1.MultiSelect=true;
dataTable.Columns[Resources.ColumnName\u IDNr].AutoIncrement=true;
dataTable.Columns[Resources.ColumnName\u IDNr].AutoIncrementSeed=-1;
dataTable.Columns[Resources.ColumnName\u IDNr].AutoIncrementStep=-1;
}
/// 
///使用workingData&approvedData数据表填充_myDataAdapter数据适配器,并将2个数据表添加到_localDatabaseCopy数据集。
/// 
私有无效初始值ElocalDatabaseCopy()
{
_localDatabaseCopy=新数据集();
DataTable workingData=新数据表(Resources.workingDatabaseTableName);
DataTable approvedData=新数据表(Resources.ApprovedDatabaseTableName);
使用(MySqlConnection=newmysqlconnection(ConnectionString))
{
_myDataAdapter=new MySqlDataAdapter(string.Format(“select*from{0}”,Resources.workingDatabaseTableName),connection);
_myDataAdapter.Fill(工作数据);
_myDataAdapter.SelectCommand.CommandText=string.Format(“从{0}中选择*,Resources.ApprovedDatabaseTableName”);
_myDataAdapter.Fill(已批准的数据);
}
_localDatabaseCopy.Tables.Add(workingData);
_localDatabaseCopy.Tables.Add(approvedData);
}
私有void SaveChangesToDb(字符串表名)
{
MySqlCommandBuilder=newmysqlcommandbuilder(_myDataAdapter);
_myDataAdapter.SelectCommand.CommandText=String.Format(“从{0}中选择*表名”);
_myDataAdapter.UpdateCommand=builder.GetUpdateCommand();
_myDataAdapter.DeleteCommand=builder.GetDeleteCommand();
_myDataAdapter.InsertCommand=builder.GetInsertCommand();
DataTable deletedRecords=\u localDatabaseCopy.Tables[tableName].GetChanges(DataRowState.Deleted);
DataTable modifiedRecords=\u localDatabaseCopy.Tables[tableName].GetChanges(DataRowState.Modified);
DataTable addedRecords=\u localDatabaseCopy.Tables[tableName].GetChanges(DataRowState.Added);
尝试
{
if(deletedRecords!=null)
_myDataAdapter.Update(删除记录);
if(modifiedRecords!=null)
_myDataAdapter.Update(修改记录);
if(addedRecords!=null)
_myDataAdapter.Update(addedRecords);
_localDatabaseCopy.AcceptChanges();
}
捕获(异常)
{
MessageBox.Show(exception.Message);
}
最后
{
if(deletedRecords!=null)
deletedRecords.Dispose();
if(modifiedRecords!=null)
modifiedRecords.Dispose();
if(addedRecords!=null)
addedRecords.Dispose();
}
}
私有void btnSave\u单击(对象发送方,事件参数e)
{
SaveChangesToDb(Resources.workingdatabasetablename);
}
私有void DeleteDataRows(DataRow[]rowsToDelete,string tableIndex)
{
foreach(rowsToDelete中的DataRow行)
_localDatabaseCopy.Tables[tableIndex].Rows.Remove(row);
}
/// 
///将已批准的数据行从DataTable/DataGridview传输到MySql数据库中已批准的表
/// 
/// 
/// 
私有无效btnTransferApproved\u单击(对象发送者,事件参数e)
{
SetWaitingCursor();
TransferApprovedDataRows();
DeleteTransferDrowsFromWorkingDataTable();
SaveChangesToDb(Resources.workingdatabasetablename);
SetDefaultCursor();
}
私有void deleteTransferDrowsFromWorkingDataTable()
{
DataRow[]approvedRowsToDelete=\u localDatabaseCopy.Tables[Resources.WorkingDatabaseTableName]。选择(“Approved=1”);
DeleteDataRows(approvedRowsToDelete,Resources.workingDatabaseTableName);
}
私有void TransferApprovedDataRows()
{
DataTable myTableCopy=\u localDatabaseCopy.Tables[Resources.WorkingDatabaseTableName].Copy();
DataRow[]approvedRows=myTableCopy。选择(“Approved=1”);
//如果没有已批准的行,请退出
如果(approvedRows.Any())
{
foreach(批准行中的数据行)
{
//检查要审核的行是否已存在于审核表中
布尔冗余=假;
弗雷奇(
数据行
private void DeleteDataRows(DataRow[] rowsToDelete, string tableIndex)
{
    foreach (DataRow row in rowsToDelete)
        row.Delete();
}