[英]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.