private void button1_Click(object sender, EventArgs e) { if (!cbxTransData.Checked && !cbxCreateTable.Checked && !cbxTableScript.Checked) { MessageBox.Show("请选择复制类型", "提示", MessageBoxButtons.OK); return; } TarDBConnect(); if (cbxTransData.Checked || cbxCreateTable.Checked) { try { this.TarDB.GetUserTables(); } catch (Exception ex) { MessageBox.Show(ex.Message, "提示", MessageBoxButtons.OK); return; } } TransferParams prm = new TransferParams(); prm.SourceDB = CurrentDatabase.DataSource; prm.TargetDB = TarDB; prm.NeedTransData = cbxTransData.Checked; prm.NeedTransTable = cbxCreateTable.Checked; prm.TableScript = cbxTableScript.Checked; prm.SrcTables = CurrentDatabase.DataSource.GetTableColumns(); prm.TranTable = new List <string>(); for (int i = 0; i < this.ckbxDatabaseobject.CheckedItems.Count; i++) { string TableName = this.ckbxDatabaseobject.CheckedItems[i].ToString(); prm.TranTable.Add(TableName); } BackgroundWorker bgw = new BackgroundWorker(); bgw.WorkerReportsProgress = true; bgw.WorkerSupportsCancellation = true; bgw.ProgressChanged += bgw_ProgressChanged; bgw.RunWorkerCompleted += bgw_RunWorkerCompleted; bgw.DoWork += bgw_DoWork; bgw.RunWorkerAsync(prm); }
void bgw_DoWork(object sender, DoWorkEventArgs e) { string[] rtlMsg = new string[2]; try { StringBuilder sbrlt = new StringBuilder(); TransferParams prm = e.Argument as TransferParams; BackgroundWorker bgw = sender as BackgroundWorker; StringBuilder tblScript = new StringBuilder(); string TargetDB = prm.TargetDB.DBAType.ToString(); var TblPkeys = prm.SourceDB.GetPrimarykey(); for (int i = 0; i < prm.TranTable.Count; i++) { ReportStatus RS = new ReportStatus() { Percent = i * 100 / prm.TranTable.Count, TransObject = prm.TranTable[i], TransType = "Table" }; bgw.ReportProgress(RS.Percent, RS); DataRow[] drs = prm.SrcTables.Select("TABLE_NAME ='" + prm.TranTable[i] + "'"); if (drs == null || drs.Length == 0) { continue; } DBColumnInfo[] ColumnInfo = new DBColumnInfo[drs.Length]; bool isBigData = false; try { for (int j = 0; j < drs.Length; j++) { int Scale = 0; int.TryParse(drs[j]["SCALE"].ToString().Trim(), out Scale); int length = 2000; int.TryParse(drs[j]["LENGTH"].ToString().Trim(), out length); string ColumnName = drs[j]["COLUMN_NAME"].ToString().Trim(); DBColumnInfo DBColInfo = new DBColumnInfo() { ColumnName = ColumnName, ColumnType = drs[j]["DATATYPE"].ToString().Trim(), Length = length, Scale = Scale, NotNull = drs[j]["NOT_NULL"].ToString().Trim().ToUpper() == "Y", }; CurrentDatabase.GetTargetsType(prm.SourceDB.DBAType.ToString(), TargetDB, ref DBColInfo); ColumnInfo[j] = DBColInfo; isBigData = isBigData || DBColInfo.IsBigData; } } catch (Exception ex) { sbrlt.AppendLine(string.Format("表【{0}】字段异常,异常信息:{1} ", prm.TranTable[i], ex.Message)); } string sql = ""; try { string[] Pkeys = null; if (TblPkeys != null && TblPkeys.ContainsKey(prm.TranTable[i])) { Pkeys = TblPkeys[prm.TranTable[i]]; } sql = this.CreateTable(prm.TargetDB, prm.TranTable[i], ColumnInfo, Pkeys); tblScript.AppendLine(sql); } catch (Exception ex) { sbrlt.AppendLine(string.Format("读取表【{0}】主键并生成建表脚本时生异常,异常信信:{1} ", prm.TranTable[i], ex.Message)); } try { if (prm.NeedTransTable) { try { string dropSQL = "DROP TABLE " + prm.TranTable[i]; prm.TargetDB.ExecuteSQL(dropSQL, null); } catch { } prm.TargetDB.ExecuteSQL(sql.ToString(), null); } ReportStatus RST = new ReportStatus() { Percent = (i + 1) * 100 / prm.TranTable.Count, TransObject = "Table [" + prm.TranTable[i] + "] Created", TransType = "Table" }; bgw.ReportProgress(RS.Percent, RST); } catch (Exception ex) { sbrlt.AppendLine(string.Format("创建表【{0}】时发生异常,建表脚本 {1} ,异常信信:{2} ", prm.TranTable[i], sql.ToString(), ex.Message)); } try { if (prm.NeedTransData) { var trgCol = prm.TargetDB.GetTableColumns().Select("TABLE_NAME ='" + prm.TranTable[i] + "'"); ODAParameter[] Oprms = new ODAParameter[trgCol.Length]; for (int j = 0; j < trgCol.Length; j++) { int collng = 2000; int.TryParse(trgCol[j]["LENGTH"].ToString().Trim(), out collng); DBColumnInfo ODAColInfo = new DBColumnInfo() { ColumnName = trgCol[j]["COLUMN_NAME"].ToString(), ColumnType = trgCol[j]["DATATYPE"].ToString().Trim(), Length = collng, IsBigData = isBigData, NoLength = false, Scale = 0, NotNull = false }; CurrentDatabase.GetTargetsType(prm.TargetDB.DBAType.ToString(), "ODA", ref ODAColInfo); ODAdbType OdaType = (ODAdbType)Enum.Parse(typeof(ODAdbType), ODAColInfo.ColumnType, true); Oprms[j] = new ODAParameter() { ColumnName = trgCol[j]["COLUMN_NAME"].ToString(), DBDataType = OdaType, Direction = ParameterDirection.Input, ParamsName = trgCol[j]["COLUMN_NAME"].ToString(), Size = collng }; } int total = 0; int maxR = isBigData ? 50 : 10000; int startIndx = 0; DataTable DT_total = CurrentDatabase.DataSource.Select("SELECT COUNT(*) FROM " + prm.TranTable[i], null); int.TryParse(DT_total.Rows[0][0].ToString(), out total); while (startIndx < total) { ReportStatus RSData0 = new ReportStatus() { Percent = total == 0 ? 0 : startIndx * 100 / total, TransObject = prm.TranTable[i] + " Preparing " + startIndx.ToString() + " ~ " + (startIndx + maxR).ToString() + "/" + total.ToString() + " record ", TransType = "Data" }; bgw.ReportProgress(RS.Percent, RSData0); DataTable Source = CurrentDatabase.DataSource.Select("SELECT * FROM " + prm.TranTable[i], null, startIndx, maxR, null); Source.TableName = prm.TranTable[i]; int endIdx = (startIndx + maxR) > total ? total : startIndx + maxR; ReportStatus RSData1 = new ReportStatus() { Percent = total == 0 ? 0 : endIdx * 100 / total, TransObject = prm.TranTable[i] + " Importing " + startIndx.ToString() + " ~ " + endIdx.ToString() + "/" + total.ToString() + " record ", TransType = "Data" }; bgw.ReportProgress(RS.Percent, RSData1); TarDB.Import(Source, Oprms); startIndx = startIndx + maxR; } } } catch (Exception ex) { sbrlt.AppendLine(string.Format("导入数据到表【{0}】时发生异常:{1} ", prm.TranTable[i], ex.Message)); } } if (sbrlt.Length == 0) { sbrlt.Append("数据复制完成!"); } rtlMsg[0] = sbrlt.ToString(); rtlMsg[1] = tblScript.ToString(); } catch (Exception ex) { rtlMsg[0] = ex.ToString(); } e.Result = rtlMsg; }