Example #1
0
        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);
        }
Example #2
0
        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;
        }