2017-02-12 131 views
2

我从将MS Access .mdb数据库文件导入到SQL Server的项目有问题。我在练习数据库中编写了一个C#应用程序,用于推断数据库中的数据,并将它们放入SQL Server数据库的表中。将MS Access数据库导入到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); 
} 

回答

1

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

从那里,你可以只用几个查询SQL Server中的两个表同步。

+0

谢谢,我会用你的方法试试 – riki

1

我会用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(); 
相关问题