我已经编写了附加从定制c#列表中插入数据到MSAccess的函数。提高OleDB插入到语句中的性能,BeginTransaction CommitTransaction
第仅仅设置了为每个记录一个新的连接:
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',但是这是由你的不寻常的用法(分配迟到等)复杂 –
谢谢马克。好点,我会清理它!关于为什么第二个可能会更慢的任何想法? – nik
@npvh,因为您已经添加了另一个事务开销。 – Ehsan