簡體   English   中英

C# & SQL 服務器數據庫:記錄 Parallel.ForEach 錯誤

[英]C# & SQL Server database : record Parallel.ForEach error

我正在嘗試用 3 個不同的.txt文件填充我的 SQL 服務器數據庫,我使用常規文件完成了此操作,但這需要很長時間。 然后由於順序無關緊要(在我的數據庫中)我嘗試使用Parallel.ForEach但我收到此錯誤錯誤

這是我的代碼

using System;
using System.Windows.Forms;
using System.Data.SqlClient;
using System.Data;

namespace LogwithDataBase
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        SqlConnection con = new SqlConnection(@"Data Source=.\SQLEXPRESS;Initial Catalog=LogsUploaded;Integrated Security=SSPI");

        void filldata()
        {
            SqlDataAdapter da = new SqlDataAdapter("Select *From LogsTable", con);
            DataSet ds = new DataSet();
            con.Open();

            da.Fill(ds, "LogsTable");

            dataGridView1.DataSource = ds.Tables["LogsTable"];
            dataGridView1.Columns[1].DefaultCellStyle.Format = "yyyy-MM-dd HH:mm:ss.fff";
            con.Close();
        }

        private void datab_connect_Click(object sender, EventArgs e)
        {
            con.Open();
            IEnumerable<string> lines1 = File.ReadLines(openFileDialog1.FileName); //HWLog

            Parallel.ForEach(lines1, line1 =>
            {
                string timeStmp = line1.Split('\t')[0];
                string atmIdd = line1.Split('\t')[1];
                string fileTyp = "HWLog";
                string evenTex = line1.Split('\t')[2];
                string query = "INSERT INTO LogsTable (timestampof_log,atmID,fileType,eventText) values (@timeStmp, @atmIdd, @fileTyp, @evenTex)";
                SqlCommand cmd = new SqlCommand(query, con);
                cmd.Parameters.AddWithValue("@timeStmp", DateTime.Parse(timeStmp));
                cmd.Parameters.AddWithValue("@atmIdd", atmIdd);
                cmd.Parameters.AddWithValue("@fileTyp", fileTyp);
                cmd.Parameters.AddWithValue("@evenTex", evenTex);
                cmd.ExecuteNonQuery();
            });

            IEnumerable<string> lines2 = File.ReadLines(openFileDialog2.FileName); //SWLog
            Parallel.ForEach(lines2, line2 =>
            {
                string timeStmp = line2.Split('\t')[0];
                string atmIdd = line2.Split('\t')[1];
                string fileTyp = "SWLog";
                string evenTex = line2.Split('\t')[2];
                string query = "INSERT INTO LogsTable (timestampof_log,atmID,fileType,eventText) values (@timeStmp, @atmIdd, @fileTyp, @evenTex)";
                SqlCommand cmd = new SqlCommand(query, con);
                cmd.Parameters.AddWithValue("@timeStmp", DateTime.Parse(timeStmp));
                cmd.Parameters.AddWithValue("@atmIdd", atmIdd);
                cmd.Parameters.AddWithValue("@fileTyp", fileTyp);
                cmd.Parameters.AddWithValue("@evenTex", evenTex);
                cmd.ExecuteNonQuery();
            });

            IEnumerable<string> lines3 = File.ReadLines(openFileDialog3.FileName); //JournalLog
            Parallel.ForEach(lines3, line3 =>
            {
                string timeStmp = line3.Split('\t')[0];
                string atmIdd = line3.Split('\t')[1];
                string fileTyp = "JournalLog";
                string evenTex = line3.Split('\t')[2];
                string query = "INSERT INTO LogsTable (timestampof_log, atmID, fileType, eventText) VALUES (@timeStmp, @atmIdd, @fileTyp, @evenTex)";

                SqlCommand cmd = new SqlCommand(query, con);

                cmd.Parameters.AddWithValue("@timeStmp", DateTime.Parse(timeStmp));
                cmd.Parameters.AddWithValue("@atmIdd", atmIdd);
                cmd.Parameters.AddWithValue("@fileTyp", fileTyp);
                cmd.Parameters.AddWithValue("@evenTex", evenTex);

                cmd.ExecuteNonQuery();
            });

            string querycb = "SELECT DISTINCT fileType FROM LogsTable"; //COMBOBOXA DATA ÇEKMEK
            SqlCommand cmdcb = new SqlCommand(querycb, con); //COMBOBOXA DATA ÇEKMEK
            SqlDataReader drcb = cmdcb.ExecuteReader(); //COMBOBOXA DATA ÇEKMEK
            List<string> list = new List<string>(); //COMBOBOXA DATA ÇEKMEK
            list.Add(""); //COMBOBOXA DATA ÇEKMEK

            while (drcb.Read())
            {
                list.Add(drcb["fileType"].ToString());
            }

            drcb.Close();

            comboBox1.DataSource = list; //COMBOBOXA DATA ÇEKMEK
            con.Close();

            filldata();
        }
    }
}    

我無法解決這個問題,我不想 go 回到常規

在性能方面,我建議使用sqlbulkcopy只需用所有行填充 DataTable 並一次插入,它比對文件中的每一行進行單個查詢要快得多,這可能真的很長。

    public static void BulkInsert(IEnumerable<string> lines)
    {
        DataTable dt = new DataTable();
        dt.TableName = "LogsTable";
        
        dt.Columns.Add("timestampof_log");
        dt.Columns.Add("atmID");
        dt.Columns.Add("fileType");
        dt.Columns.Add("eventText");

        foreach (var line in lines)
        {
            string timeStmp = line.Split('\t')[0];
            string atmIdd = line.Split('\t')[1];
            string fileTyp = "JournalLog";
            string evenTex = line.Split('\t')[2];

            dt.Rows.Add(timeStmp, atmIdd, fileTyp, evenTex);

        }

        BulkInsert(dt);
    }

    public static void BulkInsert(DataTable table)
    {
        using (var bulkInsert = new SqlBulkCopy(ConnectionString))
        {
            bulkInsert.DestinationTableName = table.TableName;
            bulkInsert.WriteToServer(table);
        }
    }

最簡單的方法 - 在每個並行線程中打開 sql 連接。

Parallel.Foreach SQL 查詢有時會導致 Connection more detail here

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM