将数据集更改保存到MYSQL数据库表时出现问题
我正在用表a中的数据填充将数据集更改保存到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上的更新 这是我的密码:
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();
}