我有一个库存表大约有10000行的SQL数据库,我需要一个代码来复制所有行以更快地访问数据库文件accdb。因为此代码将每天运行。
下面的我的代码至少需要5分钟才能运行。
````````````````conn.Open();
SqlDataAdapter ada2 = new SqlDataAdapter("select ITEMCODE,DESCRIPTION,ONHAND,COSTEXCL,COSTINCL,PRICEEXCL,PRICEINCL,LASTSOLD,LASTRECEIVED from stmast", conn);
DataTable dt2 = new DataTable();
ada2.Fill(dt2);
for (int M = 0; M < dt2.Rows.Count; M++)
{
DataRow dr2 = dt2.Rows[M];
OleDbCommand cmd2 = new OleDbCommand("INSERT INTO stmast(ITEMCODE,DESCRIPTION,ONHAND,COSTEXCL,COSTINCL,PRICEEXCL,PRICEincl,LASTSOLD,LASTRECEIVED)" + " VALUES('" + dr2["itemcode"].ToString() + "','" + dr2["description"].ToString() + "','" + dr2["onhand"].ToString() + "','" + dr2["costexcl"].ToString() + "','" + dr2["costincl"].ToString() + "','" + dr2["priceexcl"].ToString() + "','" + dr2["priceincl"].ToString() + "','" + dr2["lastsold"].ToString() + "','" + dr2["lastreceived"].ToString() + "');", objConn3);
cmd2.ExecuteNonQuery();
}
MessageBox.Show("done"); ```
您可以通过将INSERT命令分组并用一个DbCommand执行它们来提高性能。
您可以按照以下步骤更改代码。在此版本中,您每10条记录执行10条INSERT查询的命令。
conn.Open();
SqlDataAdapter ada2 = new SqlDataAdapter("select ITEMCODE,DESCRIPTION,ONHAND,COSTEXCL,COSTINCL,PRICEEXCL,PRICEINCL,LASTSOLD,LASTRECEIVED from stmast", conn);
DataTable dt2 = new DataTable();
ada2.Fill(dt2);
string sqlCmd = "";
for (int M = 0; M < dt2.Rows.Count; M++)
{
DataRow dr2 = dt2.Rows[M];
sqlCmd += "INSERT INTO stmast(ITEMCODE,DESCRIPTION,ONHAND,COSTEXCL,COSTINCL,PRICEEXCL,PRICEincl,LASTSOLD,LASTRECEIVED)" + " VALUES('" + dr2["itemcode"].ToString() + "','" + dr2["description"].ToString() + "','" + dr2["onhand"].ToString() + "','" + dr2["costexcl"].ToString() + "','" + dr2["costincl"].ToString() + "','" + dr2["priceexcl"].ToString() + "','" + dr2["priceincl"].ToString() + "','" + dr2["lastsold"].ToString() + "','" + dr2["lastreceived"].ToString() + "');";
if (M % 10 == 0)
{
OleDbCommand cmd2 = new OleDbCommand(sqlCmd);
cmd2.ExecuteNonQuery();
sqlCmd = "";
}
}
//Executes the last commands
if (sqlCmd != "")
{
OleDbCommand cmd2 = new OleDbCommand(sqlCmd);
cmd2.ExecuteNonQuery();
}
MessageBox.Show("done"); ```
如果此解决方案提高了性能,请考虑使用以下语法更改您创建的SQL:
INSERT INTO stmast(...)
SELECT [Records from the first dr2 row]
UNION ALL
SELECT [Records from the next dr2 row]
UNION ALL
SELECT [Records from the next dr2 row]
[....]
也请参阅此线程以获取更多信息和其他可能的解决方案:Multiple Insert statements in one connection