我已經編寫了附加從定製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