数据库的数据同步
以下为Mysql的示例,sql需要适当修改
#region Mysql数据表的转移和备份
public ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
/// <summary>
/// 同步,超过intervalDays天的数据。从表数据表到表记录表
/// </summary>
/// <param name="TbName">需要同步的表名</param>
/// <param name="MinRowCtn">数据表总数据行数必须大于设置数才进行数据同步</param>
/// <param name="intervalDays">超时天数,默认为7</param>
/// <param name="PrimaryKey">主键(自增长主键)名称,默认为Id</param>
public void SynDataToHis(string TbName,string DataBaseName, int MinRowCtn = 5000, int intervalDays = 7, string PrimaryKey = "Id")
{
string Msg = $"SynData,表名:【{TbName}】,";
int LimitRowsCtn = 2000;//每次处理数据条数
string TbNameHistory = $"{TbName}_History";
int ExcueCtn = 0;
try
{
_db.Execute($" CREATE TABLE If Not Exists {DataBaseName}.{TbNameHistory} LIKE {DataBaseName}.{TbName} ; ");
int RowsCtn = 1;
while (RowsCtn > 0)
{
ExcueCtn++;
if (ExcueCtn > 500) break; //执行五百次退出循环
long LeaveRowCtn= _db.FirstOrDefault<long>($" SELECT count(*) from {DataBaseName}.{TbName} ");
if (LeaveRowCtn <= MinRowCtn) break;//表剩余行数小于设置行数退出循环
List<long> lstOld = _db.Fetch<long>($" SELECT * from {DataBaseName}.{TbName} WHERE CreateDate < date_add(NOW(), interval -{intervalDays.ToString()} day) ORDER BY `{PrimaryKey}` LIMIT {LimitRowsCtn} ");
RowsCtn = lstOld.Count;
if (RowsCtn > 0)
{
Msg = $"SynData,表名:【{TbName}】,";
long MaxId = lstOld.Max();
try
{
List<DTc> lstOld2 = _db.Fetch<DTc>($" select COLUMN_NAME, DATA_TYPE from information_schema.COLUMNS where table_name = '{TbName}' and TABLE_SCHEMA='{DataBaseName}' ");
//防止ID主键重复导致的报错,加符号【`】防止关键字
string ColName = string.Join(",", lstOld2.Where(a => a.COLUMN_NAME.ToUpper() != PrimaryKey.ToUpper()).Select(a => "`" + a.COLUMN_NAME + "`"));
string sql = $" INSERT INTO {DataBaseName}.{TbNameHistory} ({ColName}) SELECT {ColName} FROM {DataBaseName}.{TbName} WHERE `{PrimaryKey}` <= {MaxId} ";
var d1 = _db.Execute(sql);
Msg = Msg + ";新增成功:" + d1;
var d2 = _db.Execute($" DELETE from {DataBaseName}.{TbName} WHERE `{PrimaryKey}` <= {MaxId} ");
Msg = Msg + ";删除成功:" + d2;
}
catch (Exception ex)
{
Msg = Msg + ";同步异常:" + ex.Message;
}
log.Info(Msg);
}
}
}
catch (Exception e)
{
log.ErrorFormat($"{Msg},异常:{0}", e.Message + e.StackTrace);
}
}
public class DTc
{
public string COLUMN_NAME { get; set; }
public string DATA_TYPE { get; set; }
}
#endregion
浙公网安备 33010602011771号