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

简介: 用法: ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 DAL.AddConnStr("xxgk", "Data Source=192.
用法:
?
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
    }
}
我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
相关文章
|
4月前
|
自然语言处理 IDE 前端开发
5个可保存的在线代码片段平台推荐-变成自己的代码词典库
5个可保存的在线代码片段平台推荐-变成自己的代码词典库
57 0
|
3月前
|
API
如何把自定义的函数,记录到你的Airtest报告里
如何把自定义的函数,记录到你的Airtest报告里
|
1月前
|
存储 Java easyexcel
导出导入开发场景
导出导入开发场景
|
5月前
|
SQL 数据采集 Java
Java【代码分享 02】商品全部分类数据获取(建表语句+Jar包依赖+树结构封装+获取及解析源代码)包含csv和sql格式数据下载可用
Java【代码分享 02】商品全部分类数据获取(建表语句+Jar包依赖+树结构封装+获取及解析源代码)包含csv和sql格式数据下载可用
43 0
|
7月前
|
XML 数据格式
关于 SAP UI5 控件内容的 Excel 导出功能,如何加载所需的导出工具库
关于 SAP UI5 控件内容的 Excel 导出功能,如何加载所需的导出工具库
38 0
|
9月前
|
Java Android开发
eclipse保存自动组织导入、删除不必要的导入、格式化代码
eclipse保存自动组织导入、删除不必要的导入、格式化代码
|
存储 数据安全/隐私保护 计算机视觉
python 实现dcmtk关联pacs功能 推送下拉影像
1、dcmtk关联pacs的参数介绍 2、dcmtk命令介绍 3、演示工具的功能 4、说明使用的技术 5、遇到的问题 6、工具目前存在的缺点
232 0
python 实现dcmtk关联pacs功能 推送下拉影像
|
缓存 算法 JavaScript
如何开发一个导入/导出插件
在开发过程中,或多或少都会遇到数据格式转换的问题,如果只是简单的数据,那自然用什么方式都可以,如果遇到数据非常多、层级复杂、关联性强的数据,则需要摸索出一套合适的方法,本文会介绍两种比较可行的转换模型,他们各自适合不同的场景和喜好。
指导:如何将通讯录批量转换为vcf格式导入手机?
VCF格式通讯录格式现在用途广泛,一般诺基亚、摩托罗拉手机导出通讯录的格式即为VCF。可以把VCF格式保存到电脑上以备不时之需。而且现在很多通讯录的导入格式也是VCF,例如飞信现在就加入了导入联系人的功能,可以把手机通讯录导入飞信的通讯录里,这样不管你手机在不在,只要有一台电脑就可以对自己的通讯录里的人了如指掌了。需要强调的的是,现在一般导入VCF基本都有乱码,可以用工具VCFEncoding工具重新导入一下,这样就可以解决乱码了。还可以在网上找一些网络通讯录,里面基本都会有用记事本改VCF的功能,可是,一个一个改比较繁琐,建议用第一种方法,省时省力。上面说导入VCF格式通讯录。
指导:如何将通讯录批量转换为vcf格式导入手机?
|
机器学习/深度学习 存储 数据库
Word报告自动生成(例如 导出数据库结构)(上)
将很早之前写的一个小组件重新整理优化一下,做成一个通用的功能。适用于导出数据库的结构(表、字段等)到Word或将体检数据自动生成Word版的体检报告等。
401 0
Word报告自动生成(例如 导出数据库结构)(上)