本文主要是介绍多線程抓取資料測試,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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();
}
}
}
}
这篇关于多線程抓取資料測試的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!