none
C# 轉檔程式,如何顯示處理中,已處理幾筆資料,處理完畢等字串? RRS feed

  • 問題

  • 各位前輩好,小弟寫了Oracle資料轉到SQL Server的轉檔程式,目前已經算是完成,但是想加入在讀取資料時,顯示"讀取資料中","已處理第幾筆/共幾筆資料","處理完畢"等字樣,請問該怎麼寫呢?能否給點方向呢?謝謝!

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Data.SqlClient;
    using System.Data.OracleClient;
    using System.IO;
    
    namespace DV_VEHICLERBOLINE
    {
        public partial class Form1 : Form
        {
            #region 資料庫連線宣告
            private static string xxxx = System.Configuration.ConfigurationManager.ConnectionStrings["xxxx"].ToString();
            private static string xxxx = System.Configuration.ConfigurationManager.ConnectionStrings["xxxx"].ToString();
            #endregion
    
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                DataTable dt1 = Get_SQL_DATA();
                InsertSQL(dt1);
                UpdateSQL(dt1);
            }
    
            #region SELECT ORACLE DV_VEHICLERBOLINE
            private DataTable Get_SQL_DATA()
            {
                DataTable dt = new DataTable("dt");
                using (OracleConnection cn = new OracleConnection())
                {
                    string today = DateTime.Now.ToString("yyyy-MM-dd");
                    string lasttwoday = DateTime.Now.AddDays(-3).ToString("yyyy-MM-dd");
    
                    cn.ConnectionString = CS_YN;
                    cn.Open();
                    String strOLE = " ";   
    
                    OracleCommand cmd = new OracleCommand(strOLE, cn);
                    OracleDataReader dr = cmd.ExecuteReader();
                    dt.Load(dr);
    
                    cn.Close();
                }
                return dt;
            }
            #endregion
    
            #region INSERT INTO SQL 
            private void InsertSQL(DataTable dt)
            {
                using (SqlConnection cn = new SqlConnection())
                {
                    cn.ConnectionString = xxxx;
                    cn.Open();
                    for (int i = 0; i <= dt.Rows.Count - 1; i++)
                    { 
                        int cnt = i + 1 ;
                        label1.Text = "已處理第" + cnt + "筆/共" + dt.Rows.Count + "筆資料";
                        System.Windows.Forms.Application.DoEvents();
    
                        try
                        {
                            string strSQL = "";
                        }
                        catch(Exception e)
                        {
                            //今天日期
                            DateTime Date_log = DateTime.Now;
                            string TodayMillisecond = Date_log.ToString("yyyy-MM-dd HH:mm:ss");
                            string Today_log = Date_log.ToString("yyyy-MM-dd");
                            //把例外狀況寫到目的檔案,若檔案存在則附加在原本內容之後(換行)
                            File.AppendAllText("D:\\tran_log\\" + Today_log + ".txt", "\r\n" + TodayMillisecond + " : " + e);
                            this.Close();
                        }
                    }
                    cn.Close();
                }
            }
            #endregion
    
            #region UPDATE SQL 
            private void UpdateSQL(DataTable dt)
            {
                using (SqlConnection cn = new SqlConnection())
                {
                    cn.ConnectionString = xxxx;
                    cn.Open();
                    for (int i = 0; i <= dt.Rows.Count - 1; i++)
                    {
                        try
                        {
                            string strSQL = "";
                        }
                        catch(Exception e)
                        {
                            //今日日期
                            DateTime Date_log = DateTime.Now;
                            string TodyMillisecond = Date_log.ToString("yyyy-MM-dd HH:mm:ss");
                            string Today_log = Date_log.ToString("yyyy-MM-dd");
                            //把例外狀況寫到目的檔案,若檔案存在則附加在原本內容之後(換行)
                            File.AppendAllText("D:\\tran_log\\" + Today_log + ".txt", "\r\n" + TodyMillisecond + ":" + e);
                            this.Close();
                        }
                    }
                    cn.Close();
                }
            }
            #endregion
        }
    }
    


    • 已編輯 b7307024 2018年5月30日 上午 08:16
    2018年5月29日 上午 05:22

解答

  • 小弟在其他論壇找到解決方法,如下:

    public partial class Form1 : Form
    {
    	public Form1()
    	{
    		InitializeComponent();
    	}
    	
    	private void Form1_Load(object sender, EventArgs e)
    	{
    		Thread t = new Thread(Dowork);
    		t.Start();
    	}
    
    	private void DoWork()
    	{
    		DataTable dt = new DataTable();
    		
    		using (OracleConnection oracn = new OracleConnection())
            {
    			//部分語法省略
    			Thread.Sleep(100);
                UupdateLabel("資料讀取中...");
    			
    		}
    		
    		using (SqlConnection sqlcn = new SqlConnection())
    		{
    			//部分語法省略
    			int cnt = 1;
    			for (int i = 0; i <= dt.Rows.Count -1; i++)
    			{
    				Thread.Sleep(100);
    				UupdateLabel("已處理 " + cnt.ToString() + " / " + dt.Rows.Count + " 筆資料");
    				cnt++;
    			}
    			
    			UupdateLabel("處理完畢");
    		}
    		Thread.Sleep(500);
            Application.Exit();
    	}
    
    	private void UupdateLabel(string text)
    	{
    		if (this.InvokeRequired)
    		{
    			Action action = () => { labe2.Text = text; };
    			this.Invoke(action);
    		}
    		else
    		{
    			labe2.Text = text;
    		}
    	}
    }

    • 已標示為解答 b7307024 2018年6月20日 上午 10:23
    2018年6月20日 上午 10:23

所有回覆

  • 你如果一句句送 SQL ,可以有進度。

    如果送一整段用分號分開的 SQL ,只有 0% 跟 100% 。


    不精確的問法,就會得到隨便猜的答案;自己都不肯花時間好好描述問題,又何必期望網友會認真回答?

    2018年5月29日 下午 03:13
  • 抱歉! 我是新手,看不懂要怎麼改呢! = =

    我目前有自己新增Label,並在InsertSQL()加入程式碼,可以成功顯示字串,但是卻不會動態顯示,只會顯示最後的結果,而且我發現整個資料處理動作都跑完了,查看資料也新增完畢,form才會顯示。
    • 已編輯 b7307024 2018年5月30日 上午 07:25
    2018年5月30日 上午 07:08
  • 給您的連結有提供範例程式, 可以下載來研究
    2018年5月31日 上午 12:24
  • 小弟在其他論壇找到解決方法,如下:

    public partial class Form1 : Form
    {
    	public Form1()
    	{
    		InitializeComponent();
    	}
    	
    	private void Form1_Load(object sender, EventArgs e)
    	{
    		Thread t = new Thread(Dowork);
    		t.Start();
    	}
    
    	private void DoWork()
    	{
    		DataTable dt = new DataTable();
    		
    		using (OracleConnection oracn = new OracleConnection())
            {
    			//部分語法省略
    			Thread.Sleep(100);
                UupdateLabel("資料讀取中...");
    			
    		}
    		
    		using (SqlConnection sqlcn = new SqlConnection())
    		{
    			//部分語法省略
    			int cnt = 1;
    			for (int i = 0; i <= dt.Rows.Count -1; i++)
    			{
    				Thread.Sleep(100);
    				UupdateLabel("已處理 " + cnt.ToString() + " / " + dt.Rows.Count + " 筆資料");
    				cnt++;
    			}
    			
    			UupdateLabel("處理完畢");
    		}
    		Thread.Sleep(500);
            Application.Exit();
    	}
    
    	private void UupdateLabel(string text)
    	{
    		if (this.InvokeRequired)
    		{
    			Action action = () => { labe2.Text = text; };
    			this.Invoke(action);
    		}
    		else
    		{
    			labe2.Text = text;
    		}
    	}
    }

    • 已標示為解答 b7307024 2018年6月20日 上午 10:23
    2018年6月20日 上午 10:23
  • 為了顯示進度,埋 Thread Sleep 讓資料 insert 速度變慢,這解法實在有點奇妙。

    我的選擇會寧可放棄顯示精確度 (用轉圈圈之類的方式替代)
    而把 insert 部分改成 Bulk 的方式,縮短把資料寫進 SQL Server 的時間


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2018年6月20日 下午 01:24
    版主
  • 恩~  這個方法是別位前輩教的,我感覺比較簡單,也就拿來使用了!

    畢竟我是個新手阿,什麼都不懂!! ^^

    2018年6月21日 上午 08:45
  • 寫程式是一種考量目標與權衡取捨的活動。寫一個轉檔程式,主要目標應該是正確且快速地將資料移轉到另一個資料庫?或是能夠明確告訴使用者現在處理到第幾筆?

    可以魚與熊掌,那最好,如果不行,勢必就要犧牲某一邊,成熟的程式設計師要做到的不僅是完成程式,而且要在正確的目標下完成。

    當然,如果目標是"程式會動就好",那就無所謂怎麼寫了。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/


    2018年6月21日 下午 03:43
    版主