将数据从sql导出到ms Access accdb需要很长时间

问题描述 投票:0回答:1

我有一个库存表大约有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"); ```

c# sql ms-access
1个回答
0
投票

您可以通过将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

© www.soinside.com 2019 - 2024. All rights reserved.