2016-12-05 2 views
0

Ich versuche, um die Daten zu migrieren für die Liste der Mitarbeiter von informix db sqlserver2012 db, so zunächst wählen iMigrate Daten von Informix db Sqlserver db

-Die Daten aus den Tabellen in informix wie folgt aus:

string cmdText = "select * from permission where emp_num in(" + emplyeeRange + ") and perm_date>=? and perm_date <=?"; 
    DataTable permissionDT = ifx_conn.Return_DataTable(cmdText, CommandType.Text, paramList1); 

    cmdText = "select * from holid where emp_num in(" + emplyeeRange + ") and end_date>=? and start_date<=? "; 
    DataTable vacationDT = ifx_conn.Return_DataTable(cmdText, CommandType.Text, paramList1); 

    cmdText = "select * from empmission where emp_num in(" + emplyeeRange + ") and date(to_date)>=? and date(from_date)<=? "; 
    DataTable missionDT = ifx_conn.Return_DataTable(cmdText, CommandType.Text, paramList1); 

-Dann i die Daten von sqlserver im gleichen Bereich Datum wie folgt löschen:

  cmdText = "delete from permission where emp_num in(" + emplyeeRange + ") and perm_date>[email protected]_date and perm_date <[email protected]_date"; 
      sql_command.CommandType = CommandType.Text; 
      sql_command.Parameters.AddWithValue("@from_date", from_date.ToShortDateString()); 
      sql_command.Parameters.AddWithValue("@to_date", to_date.ToShortDateString()); 
      sql_command.CommandText = cmdText; 


      result = sql_command.ExecuteNonQuery(); 

      if (result >= 0) 
      { 
       cmdText = "delete from holid where emp_num in(" + emplyeeRange + ") and end_date>[email protected]_date and start_date<[email protected]_date "; 

       sql_command.CommandText = cmdText; 
       result = sql_command.ExecuteNonQuery(); 

       if (result >= 0) 
       { 

        cmdText = "delete from empmission where emp_num in(" + emplyeeRange + ") and to_date>[email protected]_date and from_date<[email protected]_date"; 
        sql_command.CommandText = cmdText; 
        result = sql_command.ExecuteNonQuery(); 
       } 
      } 

-Dann Legen Sie die aktualisierten Daten in sqlserver wie folgt aus:

cmdText = "insert into permission select * from @permissionDT "; 
    sql_command.CommandText = cmdText; 
    sql_command.Parameters.Clear(); 
    sql_param = sql_command.Parameters.AddWithValue("@permissionDT", permissionDT); 
    sql_param.SqlDbType = SqlDbType.Structured; 
    sql_param.TypeName = "dbo.permissionType"; 

    result = sql_command.ExecuteNonQuery(); 

     if (result >= 0) 
      { 
       cmdText = "insert into holid select * from @vacationDT"; 
       sql_command.CommandText = cmdText; 
       sql_command.Parameters.Clear(); 
       sql_param = sql_command.Parameters.AddWithValue("@vacationDT", vacationDT); 
       sql_param.SqlDbType = SqlDbType.Structured; 
       sql_param.TypeName = "dbo.holidType"; 

       result = sql_command.ExecuteNonQuery(); 

         if (result >= 0) 
         { 
          cmdText = "insert into empmission select * from @missionDT"; 
          sql_command.CommandText = cmdText; 
          sql_command.Parameters.Clear(); 
          sql_param = sql_command.Parameters.AddWithValue("@missionDT", missionDT); 
          sql_param.SqlDbType = SqlDbType.Structured; 
          sql_param.TypeName = "dbo.empmissionType"; 

          result = sql_command.ExecuteNonQuery(); 
         } 
      } 

Mein Hauptproblem ist:

Dieser Prozess die Leistung von sqlserver so lange Zeit und verringern nimmt , Wie kann ich diesen Code und die Anfragen bezüglich der db-Operationen optimieren?

+0

Sind Sie einfach Datenmigration oder etwas mehr als das zu tun? Warum müssen Sie vor dem Einfügen von Ihrem Ziel löschen? – agfc

+0

@agfc: Ich mache einige Verarbeitung danach. Ich muss löschen, weil die Daten, die ich migrieren möchte dupliziert werden oder einige Datensätze aus der Quelle gelöscht oder ein bestimmtes Feld in der Quelle aktualisiert wird. Dieser Vorgang wird mehrmals durchgeführt, so dass ich muss gelöscht und dann eingefügt werden. –

Antwort

1

Ersetzen Sie Ihren SQLCommand ("in holid select * von @vacationDT einfügen") von SQLBulkCopy wird es Ihnen viel schneller Ihren Server schreiben. z.B .:

using (var sbc = new SqlBulkCopy(myCOnnection) 
{ 

    sbc.DestinationTableName = "holid"; 
    sbc.WriteToServer(vacationDT); 

} 

Sie haben Column und/oder eingestellte Identität insert/on-off vor und nach diesem einzustellen. Mehr zu SqlBulkCopy: https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx

überprüfen Sie auch, ob Ihre DB die richtigen Indizes hat vor allem auf start_date und end_date

Verwandte Themen