将一个数据库表的数据复制到另一个
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 如何将一个库的一个表的数据复制到另一个库中的一个表