gpt4 book ai didi

c# - 更快地上传到数据库

转载 作者:行者123 更新时间:2023-11-30 21:03:07 26 4
gpt4 key购买 nike

我有一些代码可以在程序生命周期结束时将 6 个不同列表的全部内容上传到数据库中。问题是,它们是平行列表,每个列表包含大约 14,000 个项目,我必须为每个单独的项目运行插入查询。这需要很长时间,有没有更快的方法来做到这一点?以下是相关代码的示例:

    public void uploadContent()
{
var cs = Properties.Settings.Default.Database;
SqlConnection dataConnection = new SqlConnection(cs);
dataConnection.Open();

for (int i = 0; i < urlList.Count; i++)
{
SqlCommand dataCommand = new SqlCommand(Properties.Settings.Default.CommandString, dataConnection);
try
{
dataCommand.Parameters.AddWithValue("@user", userList[i]);
dataCommand.Parameters.AddWithValue("@computer", computerList[i]);
dataCommand.Parameters.AddWithValue("@date", timestampList[i]);
dataCommand.Parameters.AddWithValue("@itemName", domainList[i]);
dataCommand.Parameters.AddWithValue("@itemDetails", urlList[i]);
dataCommand.Parameters.AddWithValue("@timesUsed", hitsList[i]);

dataCommand.ExecuteNonQuery();
}
catch (Exception e)
{
using (StreamWriter sw = File.AppendText("errorLog.log"))
{
sw.WriteLine(e);
}
}

}
dataConnection.Close();
}

这是代码从配置文件中提取的命令字符串:

命令字符串:

INSERT dbo.InternetUsage VALUES (@user, @computer, @date, @itemName, @itemDetails, @timesUsed)

最佳答案

如@alerya 的回答所述,执行以下操作会有所帮助(在此处添加解释)

1) 在 for 循环之外创建命令和参数由于每次都使用相同的命令,因此每次都重新创建命令没有意义。除了创建一个新对象(这需要时间)之外,命令还必须在每次为几件事(表存在等)创建时进行验证。这会带来很多开销。

2) 将插入放入事务中将所有插入放在一个事务中会加快速度,因为默认情况下,不在一个事务中的命令将被视为它自己的事务。因此,每次插入内容时,数据库服务器都必须验证刚刚插入的内容是否实际保存(通常在硬盘上,受磁盘速度限制)。但是,当多个 INSERT 在一个事务中时,只需执行一次检查。

根据您已经显示的代码,这种方法的缺点是一个错误的 INSERT 会破坏一堆。这是否可以接受取决于您的具体要求。

放在一边您真正应该做的另一件事(尽管这不会在短期内加快速度)是正确使用 IDisposable 接口(interface)。这意味着要么在所有 IDisposable 对象(SqlConnection、SqlCommand)上调用 .Dispose(),要么理想情况下,将它们包装在 using() block 中:

using( SqlConnection dataConnection = new SqlConnection(cs) 
{
//Code goes here
}

这将防止这些点发生内存泄漏,如果您的循环变得太大,这将很快成为一个问题。

关于c# - 更快地上传到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13031362/

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