• XCode新增数据转换功能(导数据)


    用法:
    01
    02
    03
    04
    05
    06
    07
    08
    09
    10
    11
    12
    13
    14
    15
    16
    DAL.AddConnStr("xxgk", "Data Source=192.168.1.21;Initial Catalog=信息公开;user id=sa;password=Pass@word", null, "mssql");
    var dal = DAL.Create("xxgk");
     
    DAL.AddConnStr("xxgk2", "Data Source=XXGK.db;Version=3;", null, "sqlite");
    File.Delete("XXGK.db");
     
    //DAL.ShowSQL = false;
     
    var etf = new EntityTransform();
    etf.SrcConn = "xxgk";
    etf.DesConn = "xxgk2";
    etf.AllowInsertIdentity = true;
    etf.TableNames.Remove("PubInfoLog");
    //etf.OnTransformTable += (s, e) => { if (e.Arg.Name == "")e.Arg = null; };
    var rs = etf.Transform();
    Console.WriteLine("共转移:{0}", rs);


    其实你也可以自己实现,XCode内部代码如下:
    001
    002
    003
    004
    005
    006
    007
    008
    009
    010
    011
    012
    013
    014
    015
    016
    017
    018
    019
    020
    021
    022
    023
    024
    025
    026
    027
    028
    029
    030
    031
    032
    033
    034
    035
    036
    037
    038
    039
    040
    041
    042
    043
    044
    045
    046
    047
    048
    049
    050
    051
    052
    053
    054
    055
    056
    057
    058
    059
    060
    061
    062
    063
    064
    065
    066
    067
    068
    069
    070
    071
    072
    073
    074
    075
    076
    077
    078
    079
    080
    081
    082
    083
    084
    085
    086
    087
    088
    089
    090
    091
    092
    093
    094
    095
    096
    097
    098
    099
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    using System;
    using System.Collections.Generic;
    using NewLife;
    using NewLife.Collections;
    using NewLife.Log;
    #if !NET4
    using NewLife.Reflection;
    #endif
    using XCode.DataAccessLayer;
     
    namespace XCode.Transform
    {
        /// <summary>实体转换</summary>
        public class EntityTransform
        {
            #region 属性
            private String _SrcConn;
            /// <summary>源</summary>
            public String SrcConn { get { return _SrcConn; } set { _SrcConn = value; } }
     
            private String _DesConn;
            /// <summary>目的</summary>
            public String DesConn { get { return _DesConn; } set { _DesConn = value; } }
     
            private ICollection<String> _TableNames;
            /// <summary>要导数据的表,为空表示全部</summary>
            public ICollection<String> TableNames
            {
                get
                {
                    if (_TableNames == null)
                    {
                        _TableNames = new HashSet<String>(StringComparer.OrdinalIgnoreCase);
                        if (!String.IsNullOrEmpty(SrcConn))
                        {
                            foreach (var item in DAL.Create(SrcConn).Tables)
                            {
                                _TableNames.Add(item.Name);
                            }
                        }
                    }
                    return _TableNames;
                }
                set { _TableNames = value; }
            }
     
            private Int32 _BatchSize = 1000;
            /// <summary>每批处理多少行数据,默认1000</summary>
            public Int32 BatchSize { get { return _BatchSize; } set { _BatchSize = value; } }
     
            private Boolean _AllowInsertIdentity;
            /// <summary>是否允许插入自增列</summary>
            public Boolean AllowInsertIdentity { get { return _AllowInsertIdentity; } set { _AllowInsertIdentity = value; } }
            #endregion
     
            #region 方法
            /// <summary>把一个链接的数据全部导入到另一个链接</summary>
            /// <returns></returns>
            public Int32 Transform()
            {
                var dal = DAL.Create(SrcConn);
     
                var tables = dal.Tables;
                tables.RemoveAll(t => t.IsView);
                var tns = TableNames;
                if (tns != null && tns.Count > 0) tables.RemoveAll(t => !tns.Contains(t.Name) && !tns.Contains(t.Alias));
     
                var total = 0;
                foreach (var item in tables)
                {
                    if (OnTransformTable != null)
                    {
                        var e = new EventArgs<IDataTable>(item);
                        OnTransformTable(this, e);
                        if (e.Arg == null) continue;
                    }
     
                    total += TransformTable(dal.CreateOperate(item.Name));
                }
     
                return total;
            }
     
            /// <summary>把一个表的数据全部导入到另一个表</summary>
            /// <param name="eop">实体操作者。</param>
            /// <param name="getData">用于获取数据的委托</param>
            /// <returns></returns>
            public Int32 TransformTable(IEntityOperate eop, Func<Int32, Int32, IEntityList> getData = null)
            {
                var name = eop.TableName;
                var count = eop.Count;
                if (getData == null) getData = (start, max) => eop.FindAll(null, null, null, start, max);
     
                // 在目标链接上启用事务保护
                eop.ConnName = DesConn;
                eop.BeginTransaction();
                try
                {
                    XTrace.WriteLine("{0} 共 {1}", name, count);
     
                    // 允许插入自增
                    var oldII = eop.AllowInsertIdentity;
                    if (AllowInsertIdentity) eop.AllowInsertIdentity = true;
                    // 关闭SQL日志
                    var oldShowSql = DAL.ShowSQL;
                    DAL.ShowSQL = false;
     
                    var total = 0;
                    var index = 0;
                    while (true)
                    {
                        eop.ConnName = SrcConn;
                        var list = getData(index, BatchSize);
                        if (list == null || list.Count < 1) break;
                        index += list.Count;
     
                        // 处理事件,外部可以修改实体数据
                        if (OnTransformEntity != null)
                        {
                            var e = new EventArgs<IEntity>(null);
                            foreach (var entity in list)
                            {
                                e.Arg = entity;
                                OnTransformEntity(this, e);
                            }
                        }
     
                        eop.ConnName = DesConn;
                        var rs = list.Insert(true);
                        XTrace.WriteLine("{0} 导入 {1}/{2} {3:p}", name, index, count, (Double)index / count);
     
                        total += rs;
                    }
                    DAL.ShowSQL = oldShowSql;
                    // 关闭插入自增
                    if (AllowInsertIdentity) eop.AllowInsertIdentity = oldII;
     
                    // 在目标链接上启用事务保护
                    eop.ConnName = DesConn;
                    eop.Commit();
     
                    return total;
                }
                catch (Exception ex)
                {
                    XTrace.WriteLine("{0} 错误 {1}", name, ex.Message);
                    // 在目标链接上启用事务保护
                    eop.ConnName = DesConn;
                    eop.Rollback();
                    throw;
                }
            }
            #endregion
     
            #region 事件
            /// <summary>转换表时触发。如果参数被置空,表示不转换该表</summary>
            public event EventHandler<EventArgs<IDataTable>> OnTransformTable;
     
            ///// <summary>转换实体时触发</summary>
            //public event EventHandler<EventArgs<IEntity>> OnTransformEntity;
     
            /// <summary>转换实体时触发</summary>
            public event EventHandler<EventArgs<IEntity>> OnTransformEntity;
            #endregion
        }
    }
    我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
  • 相关阅读:
    php 发送超大数据处理
    Linux 忘记了mysql 密码
    利用mysqldump 实现每天备份方案
    window 下忘记了mysql 密码的解决方法
    MySQL添加字段和修改字段的方法
    php 即使客户端或者服务器断开(如关掉浏览器)脚本也可以继续执行
    PHP面向对象05_接口与多态
    PHP面向对象06_异常处理
    PHP面向对象07_PDO
    PHP面向对象之魔术方法复习
  • 原文地址:https://www.cnblogs.com/nnhy/p/2493859.html
Copyright © 2020-2023  润新知