我目前正试图将数据表插入到数据库中.它工作得很好,速度很快.唯一的问题出现了如果数据库中已存在任何行(重复键).为了解决这个问题,我修改了我的程序,以便我首先检查每个新条目是否已存在于数据库中.这是…….慢(在...
我目前正试图将数据表插入到数据库中.它工作得很好,速度很快.唯一的问题出现了
如果数据库中已存在任何行(重复键).
为了解决这个问题,我修改了我的程序,以便我首先检查每个新条目是否已存在于数据库中.
这是…….慢(在目前的情况下,我没有很多条目,但后来我需要检查的超过200k条目和那几次).
因此,我需要让它变得更快(如果可能的话).
数据表的结构如下:
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)
现在我的问题是:有没有办法更快地做到这一点,以免得到密钥违规问题?
解决方法:
在这种情况下,我会使用一些临时表.这是一些步骤:
>批量插入登台表(使用SqlBulkCopy)
>使用带有左连接的存储过程插入到基表中以消除现有行
>截断登台表
因此,您需要在代码中删除foreach语句,添加存储过程以插入基表,添加存储过程以进行截断.或者您可以将最后两个步骤合二为一.
沃梦达教程
本文标题为:c# – 如何根据数据库中的现有条目快速减少数据表
基础教程推荐
猜你喜欢
- C#使用base64对字符串进行编码和解码的测试 2023-01-11
- 使用C#9中records作为强类型ID的实例教程 2023-03-29
- C#编程之依赖倒置原则DIP 2023-05-26
- Netcore Webapi返回数据的三种方式示例 2023-07-04
- C#基于SerialPort类实现串口通讯详解 2023-05-16
- C#如何生成唯一订单号 2022-12-31
- C# DataGridView中实现勾选存储数据和右键删除数据(示例代码) 2023-04-22
- C# ArrayList、HashSet、HashTable、List、Dictionary的区别详解 2023-01-28
- C#封装DBHelper类 2023-06-05
- C#多线程中的异常处理操作示例 2023-01-22