1

这儿存在一个问题。我有一些数据的旧数据库,另一方面我有新结构的新数据库。

现在我需要最好的方法(想法)如何将数据从一个表复制到另一个表。问题是一些表最多有 1000 条记录,一些 32 000 一些 640 000,复制 5000+ 的时间真的很长。

任何最佳做法?下面的示例代码...

public ActionResult ImportTable1()
{
   var oldTable1 = context.OLDTABLE.ToList();

   foreach (var item in oldTable1)
   {
      try
      {
          var cTable = contextNew.NEWTABLE.Where(p => p.fiel1 == item.field1).FirstOrDefault();

          if (cTable == null)
          {
             NEWTABLE nTable = new NEWTABLE
             {
                                field1 = item.field1,
                                field2 = item.field2
             };

             contextNew.NEWTABLE.Add(nTable);
          }
          else
          {
             cTable.field1 = item.field1
             cTable.field2 = item.field2;

             contextNew.Entry(cTable).State = EntityState.Modified;
          }

          IcontextNew.SaveChanges();
      }
      catch (DbEntityValidationException dbEx)
      {
         foreach (var validationErrors in dbEx.EntityValidationErrors)
         {
            foreach (var validationError in validationErrors.ValidationErrors)
            {
               _progresLog = ("Property: " + validationError.PropertyName + " Error: {1}" + validationError.ErrorMessage);
            }
         }
     }

   return PartialView();
}

...现在这么大

    public void ExperimentalPartsBulk()
    {
        string msisDatabase = ConfigurationManager.ConnectionStrings["old"].ToString();
        string newDatabase = ConfigurationManager.ConnectionStrings["new"].ToString();

        SqlConnection sourceconnection = new SqlConnection(msisDatabase);
        SqlConnection sourcedestination = new SqlConnection(newDatabase);


        sourceconnection.Open();
        SqlCommand cmd = new SqlCommand("Select * from ELEMENTS");
        cmd.Connection = sourceconnection;
        SqlDataReader reader = cmd.ExecuteReader();

        //Connect to Destination DataBase
        SqlConnection destinationConnection = new SqlConnection(newDatabase);
        destinationConnection.Open();


        SqlBulkCopy bulkCopy = new SqlBulkCopy(destinationConnection);
        bulkCopy.DestinationTableName = "ELEMENTSNEW";
        bulkCopy.ColumnMappings.Clear();
        bulkCopy.ColumnMappings.Add("fielString1", "newString1");
        bulkCopy.ColumnMappings.Add("fielString2", "newStrin2");
        bulkCopy.ColumnMappings.Add("fielFloat1", "newINT1");
        bulkCopy.WriteToServer(reader);
        reader.Close();

        sourceconnection.Close();
        sourcedestination.Close();

    }

现在的问题是两个表之间的 w 差异

fielString1可以为 null,newString1不能为 | fielFloat1是 float 现在可以为空,但 newINT1不是

如何在某些条件下导入或导入到不同类型的字段?

4

2 回答 2

0

西维克,

由于性能问题,第一个代码示例中显示的任何循环都将失败....正如您所指出的!

这里正确的方法是 SQL 方法。这个想法是将所有数据“刷新”到新数据库。刷新意味着所有记录(5,000 或 500,000)都通过一个操作存储到新数据库!并避免在提取、过滤、编辑和保存数据过程中出现任何循环,因为 640,000 个循环需要很长时间......

批量复制是一种可能。批量复制的问题是您很难过滤和编辑此对象中的数据。

使用 ADO.net DataSet 从旧 DB 中获取数据,对其进行过滤、编辑,并将其保存在内存中并将其刷新到新 DB。DataSet 对每个操作采取一步(提取、过滤、编辑等!无循环)。

或者,尝试 SQL 复制。复制是将数据从数据库“A”表“oneTable”复制到另一个数据库的 SQL 机制,“B”与具有不同模式和规则的表“AnotherTable”。试试看。如果您认为这对您来说是一个合理的解决方案,我可以指定更多。不需要代码,它可以使用 SQL Management Studio 上的向导创建,并在需要时运行(通过 SQL 作业代理)。

于 2013-05-19T14:44:28.250 回答
0

您应该认真考虑 SSIS 或 bcp。否则,您将看到一个场景,即您将数据从源服务器一直拉到执行 .net 代码的客户端框,然后将所有数据推送到目标服务器。想想正在消耗的带宽。如果您可以改为将 SSIS 导出到目的地,那么至少可以消除额外的担忧。

如果您绝对必须将数据下拉到客户端,请考虑将数据写入 bcp 格式的文件,然后将它们批量复制到目标服务器中。

我很确定您会发现这两种路径都比使用普通的旧 ADO.NET 方法要快得多。

于 2013-05-19T15:02:51.407 回答