iT邦幫忙

0

[已解決] C# 轉檔程式,如何顯示處理中,已處理幾筆資料,處理完畢等字串?

各位前輩好,小弟寫了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
    }
}

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

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 iT邦新手 4 級 ‧ 2018-06-20 18:25:57 檢舉
小弟在其他論壇找到解決方法,如問題底部!

2 個回答

0
小魚
iT邦大師 1 級 ‧ 2018-05-29 19:39:27

用個Label吧,
就可以顯示訊息了,
也可以考慮進度條,
不過在程式運行中通常不會馬上更新,
可以加個 System.Windows.Forms.Application.DoEvents();
就會先更新畫面再繼續往下跑了。

b7307024 iT邦新手 4 級 ‧ 2018-05-30 15:15:10 檢舉

小魚大,抱歉!我是個新手,轉檔程式也照著前人寫的程式修改出來的,請問System.Windows.Forms.Application.DoEvents();是要加在哪個區塊呢?謝謝!

0
海綿寶寶
iT邦大神 1 級 ‧ 2018-05-30 12:30:39
private void InsertSQL(DataTable dt)
{
   int cnt = 0;
   foreach(DataRow row in dt.Rows)
   {
      //原來轉檔的程式碼
      cnt++;
      label1.Text = "已處理第" + cnt.ToString() + "筆/共" + dt.Rows.Count().ToString() + "筆資料"
   }
}
看更多先前的回應...收起先前的回應...
b7307024 iT邦新手 4 級 ‧ 2018-05-30 15:22:10 檢舉

回海綿寶寶大

我照您的方法做,可以成功顯示字串,但是卻不會動態顯示,只會顯示最後的結果,而且我發現整個資料處理動作都跑完了,查看資料也新增完畢,form才會顯示,請問接下要怎麼改呢?謝謝!

sam0407 iT邦高手 1 級 ‧ 2018-05-30 16:05:05 檢舉

小魚大不是有教了....
在程式裡加一行System.Windows.Forms.Application.DoEvents();
建議就放在label1.Text的下一行

b7307024 iT邦新手 4 級 ‧ 2018-05-30 16:18:46 檢舉

我照您說的加在label1.Text的下一行,結果還是一樣呢!

        #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

網路上找到兩派作法
一是DoEvents
二是BackgroundWorker
不妨兩者都試試看

label1.Refresh()
試過這個嗎?
MSDN: System.Windows.Forms.Control.Refresh

我要發表回答

立即登入回答