【发布时间】:2013-08-12 17:47:37
【问题描述】:
我已经编写了将自定义 c# 列表中的数据插入 MSAccess 的附加函数。
第一个只是为每个单独的记录集建立一个新的连接:
public static void appenddatatotable(string connectionstring, string tablename, string[] values)
{
var myconn = new OleDbConnection(connectionstring);
var cmd = new OleDbCommand();
cmd.CommandText = "INSERT INTO " + tablename + " ([RunDate],[ReportingGroup], [Tariff], [Year]) VALUES(@RunDate, @ReportingGroup, @Tariff, @Year)";
cmd.Parameters.AddRange(new[] { new OleDbParameter("@RunDate", values[0]), new OleDbParameter("@ReportingGroup", values[1]), new OleDbParameter("@Tariff", values[2]), new OleDbParameter("@Year", values[3])});
cmd.Connection = myconn;
myconn.Open();
cmd.ExecuteNonQuery();
myconn.Close();
}
然后,我只需遍历我的值列表并在每次迭代时调用此函数。这工作正常,但速度很慢。
在第二个函数中,我尝试在函数中包含循环并使用 BeginTransction 和 Committransaction:
public static void appenddatatotable2(string connectionstring, string tablename, string datstr, List<PowRes> values)
{
var myconn = new OleDbConnection(connectionstring);
int icounter = 0;
var cmd = new OleDbCommand();
OleDbTransaction trans = null;
cmd.Connection = myconn;
myconn.Open();
foreach (var item in values)
{
if (icounter == 0)
{
trans = cmd.Connection.BeginTransaction();
cmd.Transaction = trans;
}
cmd.CommandText = "INSERT INTO " + tablename + " ([RunDate],[ReportingGroup], [Tariff], [Year]) VALUES(@RunDate, @ReportingGroup, @Tariff, @Year)";
if (string.IsNullOrEmpty(item.yr))
item.yr = "";
cmd.Parameters.AddRange(new[] { new OleDbParameter("@RunDate", datstr), new OleDbParameter("@ReportingGroup", item.RG), new OleDbParameter("@Tariff", item.tar), new OleDbParameter("@Year", item.yr)});
cmd.ExecuteNonQuery();
icounter++;
if (icounter >= 500)
{
trans.Commit();
icounter = 0;
}
}
if (icounter > 0)
{
trans.Commit();
}
myconn.Close();
}
这也可以正常工作,但速度更慢。
我的代码错了吗?如何加快多次插入?
谢谢!
【问题讨论】:
-
与问题无关,但非常重要:您应该在此处使用
using语句,用于myconn和cmd,以确保即使出现问题也能清理它们。可能还有trans,但由于您的不寻常用法(分配迟到等)而变得复杂 -
谢谢马克。好点,我会清理它!关于为什么第二个可能会更慢的任何想法?
-
@npvh 因为您添加了另一个开销,即事务。
-
@npvh 在访问方面,所有理智的期望都会飞出窗外;然而,我们没有理由期望它会更快,我们应该期望它更慢(我们在事务管理方面增加了开销)
-
您需要更深入地了解这一点 - 什么是真正的 slow、您的代码或数据库?一旦你知道瓶颈在哪里,你就可以看看如何优化。