将一个数据库表的数据复制到另一个

Posted

技术标签:

【中文标题】将一个数据库表的数据复制到另一个【英文标题】:Copying the data of one database table to another 【发布时间】:2018-03-05 15:55:22 【问题描述】:

我正在尝试编写一个 C# 应用程序,该应用程序将数据从 OleDb 数据库的一个表读取到 OleDb 数据库的另一个表。源表和目标表将在运行时由用户决定。

我现在的做法是将所有内容读入 OleDbDataReader,遍历每一行并插入其他表。

  // create insert string
  insert = "INSERT INTO " + Dest_Table + " VALUES (";
  for(int i = 0; i < cols.Length; i++)       // cols is array of column names
  
      string coma = ", ";
      if (i == cols.Length - 1)
      coma = " )";

      insert += "?" + coma;
  

  // read each row and insert
  while (src_reader.Read())
  
      dstcmd.CommandText = insert;

      for (int i = 0; i < cols.Length; i++)
      
          string temp = "@" + cols[i];
          dstcmd.Parameters.AddWithValue(temp, src_reader[cols[i]]);

          // for debug purpose
          Console.Write(temp + "  " + src_reader[cols[i]] + "\n");
      

      dstcmd.ExecuteNonQuery();

  

我想知道,有没有更好更有效的方法在不同数据库的表之间进行数据传输?或者这是唯一的方法? 我知道在 SqlConnection 中有一个 SqlBulkCopy 方法可以做到这一点,但是 OleDbConnection 呢?有没有类似于 SqlBulkCopy 的东西?

任何帮助将不胜感激。谢谢。

【问题讨论】:

数据库是 MS Access 数据库吗? 这将由用户决定。它可以是 mysql 或 Sql-Server 或 MS Access。两个数据库的连接字符串将在运行时提供。 这对我来说似乎是一个 SDLC 操作,而不是重新发明***,可以使用 Red Gate 产品来实现这一点。 red-gate.com/products/sql-development/sql-data-compare 因为我在上大学,我需要编写解决方案,所以不能真正交出互联网上已经存在的软件。我已经实施了一个解决方案。只是想知道是否有更好的方法。由于我是 SQL 和 ado.net 世界的新手,因此每条建议都是值得学习的一课。 这里有一些很好的答案:***.com/questions/7070011/… 【参考方案1】:

我也遇到了和你类似的问题,分享一下自己解决的功能,希望对你有帮助

Public bool InsertIntoDB(string tableName, DataTable _dataTable)
    
        bool Result = false;
        DataTable ColumnsSQL = GetColumns(tableName);
        string CommandInsert = "Insert Into " + tableName + " (";
        string CommandValue = "";
        string commandSQL = "";
        DateTime Helpconstruct = new DateTime();
        String Word = "";
        String ValueToAdd = ""; 
        string connectionString = ConfigurationManager.ConnectionStrings["Connection"].ConnectionString;
        FuncAuxC2C HELPPLEASE = new FuncAuxC2C();
        SqlConnection conn = new SqlConnection(connectionString);
        SqlCommand cmd = new SqlCommand(null, conn);

        for (int k = 0; k < _dataTable.Rows.Count; k++)
        

            for (int i = 0; i < ColumnsSQL.Rows.Count - 1; i++)
            
                CommandInsert += ColumnsSQL.Rows[i][0].ToString();

                if (_dataTable.Rows[k][i].ToString() != "")
                
                    ValueToAdd = _dataTable.Rows[k][i].ToString();
                    if (char.IsNumber(ValueToAdd[0]))
                    
                        bool haveDigits = false;

                        foreach (char c in _dataTable.Rows[k][i].ToString())
                        
                            if (c < '0' || c > '9')
                            
                                haveDigits = true;
                                continue;
                            

                        

                        if (haveDigits == true && _dataTable.Rows[k][i].ToString().Contains("e+") && _dataTable.Rows[k][i].ToString().Contains(","))
                        

                            _dataTable.Rows[k][i] = Decimal.Parse(_dataTable.Rows[k][i].ToString(), System.Globalization.NumberStyles.Float).ToString();

                        
                    
                

                if (_dataTable.Columns[i].ColumnName.ToString() == "Data" && _dataTable.Rows[k][i].ToString() != "")
                
                    //This is just to format date
                    ValueToAdd = HELPPLEASE.alterDataformat(_dataTable.Rows[k][i].ToString(), "yyyyMMdd", "-");

                
                else if (_dataTable.Columns[i].ColumnName.ToString() == "tipificacao_datetime" && _dataTable.Rows[k][i].ToString() != "" )
                
                    //This is just to format date 
                    ValueToAdd = HELPPLEASE.alterDataformat(_dataTable.Rows[k][i].ToString(), "yyyyMMddHHMMSS", "-");
                
                else
                
                    if (_dataTable.Rows[k][i].ToString().Length < 250)
                    
                        ValueToAdd = _dataTable.Rows[k][i].ToString();
                    
                    else
                    
                        ValueToAdd = _dataTable.Rows[k][i].ToString().Substring(0, 250);
                    
                


                cmd.Parameters.AddWithValue("@" + ColumnsSQL.Rows[i][0].ToString(), SqlDbType.VarChar).Value = ValueToAdd;
                ValueToAdd = "";


                CommandValue += "@" + ColumnsSQL.Rows[i][0].ToString();

                if (ColumnsSQL.Rows.Count - 2 != i)
                
                    CommandInsert += ", ";
                    CommandValue += ", ";
                

            



            commandSQL = CommandInsert + ") VALUES (" + CommandValue + ")";
            try
            

                conn.Open();
                cmd.CommandText = commandSQL;
                cmd.ExecuteNonQuery();
                conn.Close();
                cmd.Parameters.Clear();

                commandSQL = "";
                CommandValue = "";
                CommandInsert = "";
                CommandInsert = "Insert Into " + tableName + " (";
                Result = true;
            
            catch (Exception ex)
            
                conn.Close();
                Result = false;
            
            finally
            
                cmd.Parameters.Clear();
                commandSQL = "";
                CommandValue = "";
                CommandInsert = "";
                CommandInsert = "Insert Into " + tableName + " (";
                conn.Close();
            
        


        return Result;
    


【讨论】:

您好 Joana,您的解决方案似乎不错,但我不太确定其中一些方法是否适用于 MS-Access。但是,您的回答确实帮助我解决了我遇到的一个问题,我没有清除命令参数,所以程序在第一次插入后抛出错误。现在没有了。谢谢:) 我赞成这个答案,但不能接受,因为它没有解决主要问题“有没有更好的方法?”尽管如此,它肯定对我有帮助。所以感谢您发布它。 :) 在访问方面,我只有一个将 Access 文件转换为 Excel 的应用程序。如果你觉得有趣,我可以和你分享。 :) @Shrey

以上是关于将一个数据库表的数据复制到另一个的主要内容,如果未能解决你的问题,请参考以下文章

将数据从一个表复制到另一个表

如何将一个数据库中的一个表复制到另一个数据库中去

mysql 如何将一个库的一个表的数据复制到另一个库中的一个表

SQL语句如何把一个表的数据复制到另一个表里面

如何使用复制命令在 postgres 中将数据从一个表复制到另一个表

Google Spanner - 如何将数据复制到另一个表?