gpt4 book ai didi

c# - 如何根据数据库中的现有条目快速减少数据表

转载 作者:太空狗 更新时间:2023-10-29 23:06:28 25 4
gpt4 key购买 nike

我目前正在尝试将数据表批量插入到数据库中。它工作得很好而且很快。唯一的问题出现如果数据库中已有任何行(重复键)。

为了解决这个问题,我修改了我的程序,以便我首先检查每个新条目是否已存在于数据库中。这是.......慢(在目前的情况下,我没有很多条目,但后来我需要检查超过 20 万个条目,并且检查了几次)。因此,我需要让它像现在这样更快(如果可能的话)。

数据表的结构是这样的:

DataTable transactionTable.Columns.Add("DeviceId", typeof(Int32));
transactionTable.Columns.Add("LogDate", typeof(DateTime));
transactionTable.Columns.Add("LogType", typeof(Int32));
transactionTable.Columns.Add("LogText", typeof(String));

transactionTable.PrimaryKey = new DataColumn[3] {
transactionTable.Columns[0],
transactionTable.Columns[1],
transactionTable.Columns[2]
};

到目前为止,我有以下内容:

DataTable insertTable = transactionTable.Copy();
insertTable.Clear();
using (SqlConnection sqlcon = new SqlConnection(this.GetConnString()))
{
sqlcon.Open();
foreach (var entry in transactionTable.AsEnumerable())
{
using (SqlCommand sqlCom = sqlCon.CreateCommand())
{
sqlCom.Parameters.Clear();
sqlCom.CommandText = "SELECT 1 FROM myTable WHERE"
+ " DeviceId = @DeviceId AND LogDate = @LogDate"
+ " AND LogType = @LogType"
sqlCom.Parameters.AddWithValue("@DeviceId", entry.Field<Int32>("DeviceId"));
sqlCom.Parameters.AddWithValue("@LogDate", entry.Field<DateTime>("LogDate"));
sqlCom.Parameters.AddWithValue("@LogType", entry.Field<Int32>("LogType"));

using (SqlDataREader myRead = sqlCon.ExecuteReader()
{
myRead.Read();

if (myRead.HasRows == false)
{
insertTable.Rows.Add(entry.ItemArray);
}
}

}
}
}

// And afterwards the bulkinsert which I think is out of scope for the question itself
// (I use the insertTable there)

现在我的问题是:是否有任何方法可以更快地完成此操作以避免出现 key 违规问题?

最佳答案

在这种情况下,我会使用一些暂存表。以下是一些步骤:

  1. 批量插入暂存表(使用SqlBulkCopy)
  2. 使用带有左连接的存储过程插入到基表中以消除现有行
  3. 截断暂存表

因此您需要删除代码中的 foreach 语句,添加用于插入到基表的存储过程,添加用于截断的存储过程。或者您可以将最后 2 个步骤合二为一。

关于c# - 如何根据数据库中的现有条目快速减少数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33231246/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com