繁体   English   中英

将MS Access数据库导入SQL Server的性能降低

[英]Slow performance importing MS Access database into SQL Server

我将项目从MS Access .mdb数据库文件导入SQL Server时遇到问题。 我在实践数据库中编写了一个C#应用程序数据库,该数据库.mdb数据库中的数据并将其放在SQL Server数据库的表中。

我的问题是.mdb数据库包含大约300,000个文章,这些文章将与SQL Server数据库中的所有控件一起插入。 .mdb文件由用户选择。

如何加快文章的导入?

这是我的C#代码:

dbConn = new OleDbConnection(@"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + dialog.FileName + "; Persist Security Info = False; Jet OLEDB:Database Password = " + textBoxPwdComet.Text + "; Mode = Share Deny None");

// SqlConnection conn2 = db.apriconnessione();
try
{
    string query = "SELECT CODMARCA,CODART,DESCR,UM,PRZNETTO,PRZCASA,DATAAGG FROM ARTICOLI";

    string querycontalinee = "SELECT count(*) from ARTICOLI";

    OleDbCommand command = new OleDbCommand(query, dbConn);
    OleDbCommand commandcontalinee = new OleDbCommand(querycontalinee, dbConn);

    dbConn.Open();

    int linee = (int)commandcontalinee.ExecuteScalar();

    OleDbDataReader reader = command.ExecuteReader();
    Articolo a;

    labelstatoaggiornamento.Show();
    progressBarstatoaggiornamento.Show();

    progressBarstatoaggiornamento.Style = ProgressBarStyle.Continuous;
    progressBarstatoaggiornamento.Minimum = 0;
    progressBarstatoaggiornamento.Maximum = linee;
    progressBarstatoaggiornamento.Step = 1;

    SqlConnection conn = db.apriconnessione();

    while (reader.Read())
    {
        String CodMarca = "" + reader.GetValue(0).ToString();
        String CodArt = "" + reader.GetValue(1).ToString().Replace("'", ""); ;
        String Fornitore = "COMET";
        String Descrizione = "" + reader.GetValue(2).ToString();
        String UM = "" + reader.GetValue(3).ToString();
        String PrezzoNetto = "" + reader.GetValue(4).ToString();
        String PrezzoCasa = "" + reader.GetValue(5).ToString();
        DateTime DataAggiornamento = DateTime.Now;

        decimal Prezzo = Decimal.Parse(PrezzoNetto, System.Globalization.NumberStyles.Any);
        decimal PrezzoListino = Decimal.Parse(PrezzoCasa, System.Globalization.NumberStyles.Any);

        a = new Articolo(CodArt, CodMarca);

        a.db = db;

        if (a.ControlloDisponibilitàCOMET() == true)
        {
            string queryAggiornamento = "Update Articolo Set Descrizione='" + Descrizione + "', UM='" + UM + "', Prezzo='" + Prezzo + "',PrezzoListino='" + PrezzoListino + "',DataAggiornamento='" + DataAggiornamento + "',Stato='Aggiornamentoincorso' Where CodMarca = '" + CodMarca + "' AND CodArt = '" + CodArt + "' AND Importato = 'COMET' and Fornitore='COMET' ";

            SqlCommand commaggiorna = new SqlCommand(queryAggiornamento, conn);

            try
            {
                commaggiorna.ExecuteNonQuery();
            }
            catch (Exception ex)
            {
                Console.WriteLine(" " + ex);
            }
       }
       else 
       {
           string query2 = "INSERT INTO Articolo (CodMarca, CodArt, Fornitore, Importato, Descrizione, UM, Prezzo, PrezzoListino, Stato) VALUES (@CodMarca, @CodArt, @Fornitore, @Importato, @Descrizione, @UM, @Prezzo, @PrezzoListino, @Stato)";

           SqlCommand myCommand = new SqlCommand(query2, conn);

           myCommand.Parameters.AddWithValue("@CodMarca", CodMarca);
           myCommand.Parameters.AddWithValue("@CodArt", CodArt);
           myCommand.Parameters.AddWithValue("@Fornitore", Fornitore);
           myCommand.Parameters.AddWithValue("@Importato", Fornitore);
           myCommand.Parameters.AddWithValue("@Descrizione", Descrizione);
           myCommand.Parameters.AddWithValue("@UM", UM);

           decimal PrezzoNetto2 = Decimal.Parse(PrezzoNetto, System.Globalization.NumberStyles.Any);
           myCommand.Parameters.AddWithValue("@Prezzo", PrezzoNetto2);

           decimal PrezzoCasa2 = Decimal.Parse(PrezzoCasa, System.Globalization.NumberStyles.Any);
           myCommand.Parameters.AddWithValue("@PrezzoListino", PrezzoCasa2);

           DateTime dt = Convert.ToDateTime(DataAggiornamento);
           myCommand.Parameters.AddWithValue("@Stato", "Aggiornamentoincorso");

           myCommand.ExecuteNonQuery();
       }

       progressBarstatoaggiornamento.PerformStep();

       int percent = (int)(((double)progressBarstatoaggiornamento.Value / (double)progressBarstatoaggiornamento.Maximum) * 100);

       progressBarstatoaggiornamento.CreateGraphics().DrawString(percent.ToString() + "%", new Font("Arial", (float)8.25, FontStyle.Regular), Brushes.Black, new PointF(progressBarstatoaggiornamento.Width / 2 - 10, progressBarstatoaggiornamento.Height / 2 - 7));
    }

    string queryNonDisponibili = "Update  Articolo Set Stato='Nondisponibile' where Stato!='Aggiornamentoincorso' AND Fornitore='COMET' AND Importato='COMET'";
    string queryNonDisponibili2 = "Update  Articolo Set Stato='Disponibile' where Stato='Aggiornamentoincorso' AND Fornitore='COMET' AND Importato='COMET'";

    SqlCommand comm = new SqlCommand(queryNonDisponibili, conn);
    SqlCommand comm2 = new SqlCommand(queryNonDisponibili2, conn);

    comm.ExecuteNonQuery();
    comm2.ExecuteNonQuery();

    Console.WriteLine("\n Passaggio Completato");
    conn.Close();

    db.chiudiconnessione();
    dbConn.Close();
}
catch (Exception ex)
{
    MessageBox.Show("La password è errata oppure " + ex);
}

考虑使用SqlBulkCopy 由于您正在运行sql查询,因此建议您尽可能在服务器端工作。 在Sql Server中创建一个临时表,将所有记录添加到数据表或数据行数组中,并使用SqlBulkCopy进行导入。 我认为这是将所有记录移至Sql Server的最快方法。

从那里,您仅需几个查询即可同步Sql Server中的两个表。

我会使用SqlBulkCopy ...

dbConn = new OleDbConnection(@"Provider = Microsoft.Jet.OLEDB.4.0; Data Source=" + dialog.FileName + "; Persist Security Info = False; Jet OLEDB:Database Password = " + textBoxPwdComet.Text + "; Mode = Share Deny None");

 SqlConnection conn2 = db.apriconnessione();
 string query = "SELECT CODMARCA,CODART,DESCR,UM,PRZNETTO,PRZCASA,DATAAGG FROM ARTICOLI"; 
OleDbDataAdapter da = new OleDbDataAdapter(query,dbConn);
DataTable dt = new DataTable();
da.Fill(dt);
conn2.Open();
SqlBulkCopy bulk = new SqlBulkCopy(conn2);
bulk.DestinationTableName = "ARTICOLI";
bulk.WriteToServer(dt);
conn2.close();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM