多線程抓取資料測試

select * into test_source_data from sys.all_parameters

select * into test_dest_data from test_source_data where 1=2;

三個cs文件

DataCopy.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;
using System.Data.SqlClient;

namespace MutlThreadTest
{
    public class DataCopy
    {
        string strDBconn = "Persist Security Info=False;Initial Catalog=GSONG;Data Source=.;User ID=gs;password=xxxxxx;Max Pool Size=10000;timeout=999999999";
        

        #region getSource
        public SqlDataReader getSource()
        {
            SqlDataReader sqldr;
            string strSql = "select * from test_source_data ";
            SqlConnection sqlconn = new SqlConnection(strDBconn);
            if (sqlconn.State !=ConnectionState.Open)
            {
                sqlconn.Open();
            }
            SqlCommand sqlcmd = new SqlCommand(strSql, sqlconn);
            sqldr = sqlcmd.ExecuteReader();


            return sqldr;

        }
        #endregion


        #region getTblFrame
        public DataTable getTblFrame(string strTblName)
        {
            string strQuery = "select top 1 * from " + strTblName;
            DataTable dt = new DataTable();
            DataSet ds = new DataSet();
            using (SqlConnection sqlconn = new SqlConnection(strDBconn))
            {
                if (sqlconn.State != ConnectionState.Open)
                {
                    sqlconn.Open();
                }
                using (SqlDataAdapter sda = new SqlDataAdapter(strQuery, sqlconn))
                {
                    sda.Fill(ds);
                    if (ds != null)
                    {
                        dt = ds.Tables[0];
                    }
                }
            }
            return dt;
        }
        #endregion


        #region bulkCopy
        public void bulkCopy(object obj)
        {
            DataTable dtSource = (obj as mutlThreadPara).vSourceDt;
            string strDestTblName = (obj as mutlThreadPara).strDestTblName;
            using (SqlConnection sqlconn=new SqlConnection(strDBconn))
            {
                if (sqlconn.State !=ConnectionState.Open)
                {
                    sqlconn.Open();
                }
                using (SqlBulkCopy sqlbc=new SqlBulkCopy(sqlconn))
                {
                    sqlbc.DestinationTableName = strDestTblName;
                    sqlbc.WriteToServer(dtSource);
                    dtSource.Clear();
                }

            }
        }
        #endregion

    }
}
 

mutlThreadPara.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data;

namespace MutlThreadTest
{
    public class mutlThreadPara
    {
        public DataTable vSourceDt;
        public string strDestTblName;
        
    }
}
 

 

Program.cs

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Data.SqlClient;

namespace MutlThreadTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DataCopy dc = new DataCopy();
            SqlDataReader sqldr = dc.getSource();
            string strDestTblName = "test_dest_data";
            DataTable dtDestFrame = dc.getTblFrame(strDestTblName);
            DataTable dtSource = dtDestFrame.Clone();
            if (sqldr.HasRows)
            {
                int iBatchFlag = 0;
                while (sqldr.Read())
                {
                    DataRow dr = dtSource.NewRow();
                    for (int i=0;i<sqldr.FieldCount;i++)
                    {
                        string strColName = sqldr.GetName(i).ToString();
                        dr[strColName] = sqldr[strColName].ToString();
                    }
                    dtSource.Rows.Add(dr);
                    iBatchFlag += 1;
                    if (iBatchFlag>=1000)
                    {
                        mutlThreadPara mtp = new mutlThreadPara { vSourceDt = dtSource ,strDestTblName = strDestTblName };
                        Thread td = new Thread(new ParameterizedThreadStart(dc.bulkCopy));
                        td.Start(mtp);
                        td.IsBackground = false;
                    }


                }
                if (sqldr.IsClosed == false)
                {
                    mutlThreadPara mtp = new mutlThreadPara { vSourceDt = dtSource, strDestTblName = strDestTblName };
                    Thread td = new Thread(new ParameterizedThreadStart(dc.bulkCopy));
                    td.Start(mtp);
                    td.IsBackground = false;
                }
                sqldr.Close();
                
            }
            


            
        }
        
    }

}
 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章