2016-12-05 142 views
0

我尝试从informix分贝迁移员工的列表中的数据,以sqlserver2012分贝,所以,首先我在informix选择这样数据迁移到SQLSERVER数据库

从表中数据-The:

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); 

- 然后我从sqlserver在相同范围内的日期这样删除数据:

  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(); 
       } 
      } 

- 然后插入在sqlserver更新的数据是这样的:

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(); 
         } 
      } 

我的主要问题是:

这个过程需要这么长的时间,并减少sqlserver性能,如何优化此代码和有关数据库操作的查询?

+0

你简单地迁移数据或做一些事情比这更所有正确的索引?为什么在插入之前需要从目的地删除? – agfc

+0

@agfc:我做了一些处理之后,我需要删除,因为我想迁移的数据可能会被复制,或某些记录从源删除或特定字段在源中更新。这个操作执行多次,所以我需要删除然后插入。 –

回答

1

用SQLBulkCopy替换你的SQLCommand(“insert into holid select * from @vacationDT”),它会使你的服务器写得更快。 例如: -

using (var sbc = new SqlBulkCopy(myCOnnection) 
{ 

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

} 

您可能必须设置ColumnMappings和/或设置标识插入/开关之前和之后这一点。更多关于SqlBulkCopy的:https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy(v=vs.110).aspx

另外,请检查您的数据库特别对起始日期END_DATE