using System; using System.Collections.Generic; using System.Collections.Specialized; using System.ComponentModel; using System.Data; using System.Data.SqlClient; using System.Drawing; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.SqlServer.Management.Common; using Microsoft.SqlServer.Management.Smo; namespace Quanjiang.DigitalScholl.DataSync { public partial class SyncWindow : Form { public SyncWindow() { InitializeComponent(); } string _synctype = ""; Thread thread = null; int max = 0; public SyncWindow(string synctype) { _synctype = synctype; InitializeComponent(); } private void SyncWindow_Load(object sender, EventArgs e) { this.ControlBox = false; progressBar1.Minimum = 0; progressBar1.Maximum = max; progressBar1.Value = 0; if (_synctype == "core") { ThreadStart start = new ThreadStart(SyncCoreDB); thread = new Thread(start); thread.Start(); } if (_synctype == "mis") { ThreadStart start = new ThreadStart(SyncMisDB); thread = new Thread(start); thread.Start(); } } public void SyncCoreDB() { try { //获取所有表 core MainService mainservice = new MainService(); SetValueProgressBar(SetValue, 0); SetWindowTitle("正在连接数据库..."); AppendTextValue("正在连接框架源数据库...\r\n"); //框架源 Server servercoresource = new Server(new ServerConnection(new SqlConnection(mainservice.GetDataRepository("source").getDbConnection().ConnectionString))); AppendTextValue("正在连接框架目标数据库...\r\n"); Server servercoretarget = new Server(new ServerConnection(new SqlConnection(mainservice.GetDataRepository("target").getDbConnection().ConnectionString))); if (servercoresource.Status == ServerStatus.Online) { AppendTextValue("框架源数据库连接成功...\r\n"); } if (servercoretarget.Status == ServerStatus.Online) { AppendTextValue("框架目标数据库连接成功...\r\n"); } if (servercoresource.Status != ServerStatus.Online || servercoretarget.Status != ServerStatus.Online) { AppendTextValue("数据库连接失败,请检查连接字符串或网络环境后重试!\r\n"); return; } Database databasesource = servercoresource.Databases[mainservice.GetDataRepository("source").getDbConnection().Database]; Database databasetarget = servercoretarget.Databases[mainservice.GetDataRepository("target").getDbConnection().Database]; TableCollection sourcetables = databasesource.Tables; TableCollection targettables = databasetarget.Tables; SetWindowTitle("正在同步框架表结构..."); AppendTextValue("正在同步框架表结构...\r\n"); AppendTextValue("本次同步框架表结构共" + sourcetables.Count + "个表...\r\n"); SetProgressMax(sourcetables.Count); foreach (Table sourcetable in sourcetables) { AppendTextValue("正在检测" + sourcetable.Name + "表结构...\r\n"); SetValueProgressBar(SetValue, GetProgressValue()+1); if (Program.beginTable != "") { if(sourcetable.Name!=Program.beginTable) continue; } if (targettables.Contains(sourcetable.Name)) { ColumnCollection sourcecolumns = sourcetable.Columns; foreach (Column sourcecolumn in sourcecolumns) { //检查字段是否包含 if (targettables[sourcetable.Name].Columns.Contains(sourcecolumn.Name)) { //检查数据类型 if (targettables[sourcetable.Name].Columns[sourcecolumn.Name].DataType.Equals(sourcecolumn.DataType)) { continue; } else { //修改数据类型 databasetarget.Tables[sourcetable.Name].Columns[sourcecolumn.Name].DataType = sourcecolumn.DataType; databasetarget.Tables[sourcetable.Name].Alter(); } } else { Column colmiss = new Column(databasetarget.Tables[sourcetable.Name], sourcecolumn.Name, sourcecolumn.DataType); colmiss.Collation = sourcecolumn.Collation; colmiss.Nullable = sourcecolumn.Nullable; colmiss.Identity = sourcecolumn.Identity; colmiss.Default = sourcecolumn.Default; foreach (ExtendedProperty property in sourcecolumn.ExtendedProperties) { colmiss.ExtendedProperties.Add(new ExtendedProperty(colmiss,property.Name,property.Value)); } databasetarget.Tables[sourcetable.Name].Columns.Add(colmiss); databasetarget.Tables[sourcetable.Name].Alter(); } } } else { //初始化Scripter ScriptingOptions scriptingOptions = new ScriptingOptions(); scriptingOptions.Add(ScriptOption.DriAllConstraints); scriptingOptions.Add(ScriptOption.DriAllKeys); scriptingOptions.Add(ScriptOption.Default); scriptingOptions.Add(ScriptOption.ContinueScriptingOnError); scriptingOptions.Add(ScriptOption.ConvertUserDefinedDataTypesToBaseType); scriptingOptions.Add(ScriptOption.IncludeIfNotExists); scriptingOptions.Add(ScriptOption.DriPrimaryKey); scriptingOptions.Add(ScriptOption.ExtendedProperties); StringCollection sc= sourcetable.Script(scriptingOptions); StringBuilder sb=new StringBuilder(); foreach (var s in sc) { sb.Append(s+"\r\n"); } //新建表 mainservice.GetDataRepository("target").ExecuteBySql(sb.ToString()); } } AppendTextValue("正在保存表结构,请耐心等待...\r\n"); CloseWindow(); } catch (Exception e) { AppendTextValue("error:" + e.Message + "\r\n"); } } public void SyncMisDB() { try { //获取所有表 core MainService mainservice = new MainService(); SetValueProgressBar(SetValue, 0); SetWindowTitle("正在连接数据库..."); AppendTextValue("正在连接mis源数据库...\r\n"); //框架源 Server servercoresource = new Server(new ServerConnection(new SqlConnection(mainservice.GetDataRepository("missource").getDbConnection().ConnectionString))); AppendTextValue("正在连接mis目标数据库...\r\n"); Server servercoretarget = new Server(new ServerConnection(new SqlConnection(mainservice.GetDataRepository("mistarget").getDbConnection().ConnectionString))); if (servercoresource.Status == ServerStatus.Online) { AppendTextValue("mis源数据库连接成功...\r\n"); } if (servercoretarget.Status == ServerStatus.Online) { AppendTextValue("mis目标数据库连接成功...\r\n"); } if (servercoresource.Status != ServerStatus.Online || servercoretarget.Status != ServerStatus.Online) { AppendTextValue("数据库连接失败,请检查连接字符串或网络环境后重试!\r\n"); return; } Database databasesource = servercoresource.Databases[mainservice.GetDataRepository("missource").getDbConnection().Database]; Database databasetarget = servercoretarget.Databases[mainservice.GetDataRepository("mistarget").getDbConnection().Database]; TableCollection sourcetables = databasesource.Tables; TableCollection targettables = databasetarget.Tables; SetWindowTitle("正在同步mis表结构..."); AppendTextValue("正在同步mis表结构...\r\n"); AppendTextValue("本次同步mis表结构共" + sourcetables.Count + "个表...\r\n"); SetProgressMax(sourcetables.Count); foreach (Table sourcetable in sourcetables) { AppendTextValue("正在检测" + sourcetable.Name + "表结构...\r\n"); SetValueProgressBar(SetValue, GetProgressValue() + 1); if (Program.beginTable != "") { if (sourcetable.Name != Program.beginTable) continue; } if (targettables.Contains(sourcetable.Name)) { ColumnCollection sourcecolumns = sourcetable.Columns; foreach (Column sourcecolumn in sourcecolumns) { //检查字段是否包含 if (targettables[sourcetable.Name].Columns.Contains(sourcecolumn.Name)) { //检查数据类型 if (targettables[sourcetable.Name].Columns[sourcecolumn.Name].DataType.Equals(sourcecolumn.DataType)) { continue; } else { //修改数据类型 databasetarget.Tables[sourcetable.Name].Columns[sourcecolumn.Name].DataType = sourcecolumn.DataType; databasetarget.Tables[sourcetable.Name].Alter(); } } else { Column colmiss = new Column(databasetarget.Tables[sourcetable.Name], sourcecolumn.Name, sourcecolumn.DataType); colmiss.Collation = sourcecolumn.Collation; colmiss.Nullable = sourcecolumn.Nullable; colmiss.Identity = sourcecolumn.Identity; colmiss.Default = sourcecolumn.Default; foreach (ExtendedProperty property in sourcecolumn.ExtendedProperties) { colmiss.ExtendedProperties.Add(new ExtendedProperty(colmiss, property.Name, property.Value)); } databasetarget.Tables[sourcetable.Name].Columns.Add(colmiss); databasetarget.Tables[sourcetable.Name].Alter(); } } } else { //初始化Scripter ScriptingOptions scriptingOptions = new ScriptingOptions(); scriptingOptions.Add(ScriptOption.DriAllConstraints); scriptingOptions.Add(ScriptOption.DriAllKeys); scriptingOptions.Add(ScriptOption.Default); scriptingOptions.Add(ScriptOption.ContinueScriptingOnError); scriptingOptions.Add(ScriptOption.ConvertUserDefinedDataTypesToBaseType); scriptingOptions.Add(ScriptOption.IncludeIfNotExists); scriptingOptions.Add(ScriptOption.DriPrimaryKey); scriptingOptions.Add(ScriptOption.ExtendedProperties); StringCollection sc = sourcetable.Script(scriptingOptions); StringBuilder sb = new StringBuilder(); foreach (var s in sc) { sb.Append(s + "\r\n"); } //新建表 mainservice.GetDataRepository("mistarget").ExecuteBySql(sb.ToString()); } } AppendTextValue("正在保存表结构,请耐心等待...\r\n"); CloseWindow(); } catch (Exception e) { AppendTextValue("error:" + e.Message + "\r\n"); } } #region 委托 public delegate void AppendTextValueDelegate(string text); public delegate void SetValueDelegate(int val); public delegate void CloseWindowDelegate(); public delegate void SetWindowTitleDelegate(string text); public delegate int GetProgressValueDelegate(); public delegate void SetProgressMaxDelegate(int max); public void AppendTextValue(string text) { if (this.rtblog.InvokeRequired) { AppendTextValueDelegate callback = new AppendTextValueDelegate(AppendTextValue); this.Invoke(callback, text); } else { rtblog.AppendText(text); } } public void SetProgressMax(int max) { if (this.progressBar1.InvokeRequired) { SetProgressMaxDelegate callback = new SetProgressMaxDelegate(SetProgressMax); this.Invoke(callback, max); } else { progressBar1.Maximum = max; } } public int GetProgressValue() { if (this.progressBar1.InvokeRequired) { GetProgressValueDelegate callback = new GetProgressValueDelegate(GetProgressValue); return Convert.ToInt32(this.Invoke(callback)); } else { return progressBar1.Value; } } public void SetWindowTitle(string text) { if (this.InvokeRequired) { SetWindowTitleDelegate callback = new SetWindowTitleDelegate(SetWindowTitle); this.Invoke(callback, text); } else { this.Text = text; } } public void CloseWindow() { if (this.InvokeRequired) { CloseWindowDelegate callback = new CloseWindowDelegate(CloseWindow); this.Invoke(callback); } else { this.Close(); } } public void SetValue(int val) { progressBar1.Value = val; } public void SetValueProgressBar(SetValueDelegate myDelegate, int val) { if (this.progressBar1.InvokeRequired) { this.Invoke(myDelegate, val); } else { myDelegate(val); } } #endregion private void btcancelsync_Click(object sender, EventArgs e) { CloseWindow(); } } }