网上介绍的同步方法,都需要表有主键,若没有主键该怎么办呢,为此,我自己对DATATABLE增删改自动生成相应的INSERT, DELETE, UPDATE相应的SQL语句来完成这些功能
为了不会错删,错改,对于所有没有改变的字段都作为条件,代码如下:
1. 写表的主程序
要点:(1)因为DELETE后的数据不能直接读取,所以通过DataView进行了一次转换
(2)针对修改的数据,有可能又改回原数据,但DataTable是认为修改的,但目前的程序在自动生成UPDATE的时候就会出错了,所以针对的确没有进行修改的数据进行了跳过处理
/// <summary>
/// 根据参数数据表,保存对其进行增删改的数据,该调用确保表己经存在
/// </summary>
/// <param name="pDt"></param>
public static void SaveTableOfModify(DataTable pDt)
{
string tableName = pDt.TableName;
if (conn.State != ConnectionState.Open)
{
conn.Open();
cmd.Connection = conn;
}
/// 获取修改过的数据
///
DataView deleteView = new DataView(pDt, null, null, DataViewRowState.Deleted);
DataTable deleteRows = deleteView.ToTable();
DataTable addRows = pDt.GetChanges(DataRowState.Added);
DataTable modifyRows = pDt.GetChanges(DataRowState.Modified);
IDbTransaction INSERTTRAN = conn.BeginTransaction();
/// 处理被删除的记录
///
if (deleteRows != null)
{
foreach (DataRow dr in deleteRows.Rows)
{
cmd.CommandText = ConstructDeleteSql(dr);
cmd.ExecuteNonQuery();
}
}
///处理增加记录
if (addRows != null)
{
foreach (DataRow dr in addRows.Rows)
{
cmd.CommandText = ConstructInsertSql(dr);
cmd.ExecuteNonQuery();
}
}
///处理修改记录
if (modifyRows != null)
{
forea