2017-02-12 5 views
2

У меня возникла проблема с импортом элементов из файла базы данных MS Access .mdb в SQL Server. Я написал базу данных C# на практике, которая экстраполирует данные в базе данных .mdb и помещает их в таблицу в базе данных 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-запросы, я бы предложил вам работать на стороне сервера как можно больше. Создайте временную таблицу на сервере Sql, добавьте все записи в datatable или массив datarows и используйте SqlBulkCopy для импорта. Я думаю, что это самый быстрый способ переместить все записи на Sql Server.

Оттуда вы можете синхронизировать две таблицы на сервере Sql только с несколькими запросами.

+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(); 
Смежные вопросы