我想用c#填充SQL數據庫中的數據庫表。我應該在數據庫中找到不同的數據包,然後爲每個數據包首先填寫一個包含該數據包所有行的數據表,然後查找該行的深度。我使用下面的函數,以加快通過使用並行任務的過程:使用C#進行並行編程
private void DoParrallelComputing(DataTable dtpacket, string Identifier)
{
con = new SqlConnection(strConnect);
Dictionary<int, DataTable> dtsName = new Dictionary<int, DataTable>();
Dictionary<int, SqlDataAdapter> ReaderName = new Dictionary<int, SqlDataAdapter>();
Dictionary<int, string> strName = new Dictionary<int, string>();
Dictionary<int, SqlCommand> cmdName = new Dictionary<int, SqlCommand>();
Dictionary<int, int> Node = new Dictionary<int, int>();
Dictionary<int, string> NodeID = new Dictionary<int, string>();
Dictionary<int, string> ParentID = new Dictionary<int, string>();
Dictionary<int, int> Depth = new Dictionary<int, int>();
Parallel.For(0, dtpacket.Rows.Count - 1, i =>
{
progressBarTree.Value = i;
Application.DoEvents();
string packetID = dtpacket.Rows[i][0].ToString();
strName[i] = "";
strName[i] = "SELECT Node,NodeID,ParentId,Depth from tblTree where [Identifier]='" + Identifier + "' and [PacketId]='" + packetID + "'";
strName[i] = strName[i] + " order by [Node]";
if (con.State != ConnectionState.Open)
{
con.Open();
}
ReaderName[i] = new SqlDataAdapter(strName[i], con);
dtsName[i] = new DataTable();
ReaderName[i].Fill(dtsName[i]);
int rowsCount = 0;
rowsCount = dtsName[i].Rows.Count - 1;
for (int j = rowsCount; j >= 0; j--)
{
Application.DoEvents();
Node[i] = Form1.val_int(dtsName[i].Rows[j][0].ToString());
NodeID[i] = dtsName[i].Rows[j][1].ToString();
ParentID[i] = dtsName[i].Rows[j][2].ToString();
Depth[i] = 0;
for (int ii = j - 1; ii >= 0; ii--)
{
string dtParent = "";
string nodeParent = "";
dtParent = dtsName[i].Rows[ii][1].ToString();
nodeParent = ParentID[i];
if (dtParent == nodeParent)
{
ParentID[i] = dtsName[i].Rows[ii][2].ToString();
Depth[i]++;
}
}
//Update Tree table
strName[i] = "update tblTree set depth=" + Depth[i] + " where node=" + Node[i].ToString();
if (con.State != ConnectionState.Open)
{
con.Open();
}
cmdName[i] = new SqlCommand(strName[i], con);
cmdName[i].ExecuteNonQuery();
cmdName[i].Dispose();
}
});
}
但是當我運行這個功能,我可以看到,CPU使用率70%與4個核CPU,也看到應用程序使用大約300個線程,但在10分鐘後,我看不到數據庫中的任何變化!如果我不使用「並行任務」,則需要大約20天才能完成,這就是爲什麼我要使用「並行任務」的原因。
第一觀察:你應該做盡可能多的這個數據庫服務器上儘可能。如果您使用SQL Server,則可以使用CTE來計算樹中節點的深度。見http://www.mssqltips.com/sqlservertip/1520/recursive-queries-using-common-table-expressions-cte-in-sql-server/另外 - 它看起來像所有這些都可以在SQL服務器上完成,這是爲這種類型的事情進行了優化。避免在客戶端上加入數據。 – 2012-01-03 17:42:26
通過單個SqlConnection並行傳遞300個命令不能很好地結束.. – plenderj 2012-01-03 17:58:49
謝謝,我的結構是這樣的:有一些數據包,併爲每個數據包我有層次結構,我的意思是每行都出現在它的父數據庫後,所以我怎麼能在數據庫中做到這一點? – Mohammad 2012-01-03 18:05:17