这是我在从一个 SQL Server 到另一个 SQL Server 或从 DataFiles 到 SQL 的数据迁移场景中所做的:
- 在目标 SQL Server 上创建新表(列名、主键等)
- 将现有数据加载到 DataTable 中(这就是你已经做过的)
- 现在使用 DataAdapter 将新表查询到另一个 DataTable 中(与您对 excel 文件所做的相同,只是现在查询 SQL 表。)
- 使用 DataTable 方法“Load()”将 OldData 从“table”加载到“newTable”
string PathConn = (MYSQL Connection String goes here)
OleDbConnection conn = new OleDbConnection(PathConn);
conn.Open();
OleDbDataAdapter myDataAdapter = new OleDbDataAdapter("Select * from [" + loadTextBox.Text + "$]", conn);
newTable = new DataTable();
myDataAdapter.Fill(newTable);
Now use the Load() Method on the new table:
newTable.Load(table.CreateDataReader(), <Specify LoadOption here>)
匹配的列将被导入到新的 DataTable 中。(您可以通过在 select 语句中使用别名来确保映射)
将现有数据加载到新表后,您将能够使用 DataAdapter 将更改写回数据库。
写回数据的示例:ConnString - DB 的连接字符串,SelectStmt(可以使用与之前在空表上所做的相同)并将 newTable 提供为 dtToWrite
public static void writeDataTableToServer(string ConnString, string selectStmt, DataTable dtToWrite)
{
using (OdbcConnection odbcConn = new OdbcConnection(ConnString))
{
odbcConn.Open();
using (OdbcTransaction trans = odbcConn.BeginTransaction())
{
using (OdbcDataAdapter daTmp = new OdbcDataAdapter(selectStmt, ConnString))
{
using (OdbcCommandBuilder cb = new OdbcCommandBuilder(daTmp))
{
try
{
cb.ConflictOption = ConflictOption.OverwriteChanges;
daTmp.UpdateBatchSize = 5000;
daTmp.SelectCommand.Transaction = trans;
daTmp.SelectCommand.CommandTimeout = 120;
daTmp.InsertCommand = cb.GetInsertCommand();
daTmp.InsertCommand.Transaction = trans;
daTmp.InsertCommand.CommandTimeout = 120;
daTmp.UpdateCommand = cb.GetUpdateCommand();
daTmp.UpdateCommand.Transaction = trans;
daTmp.UpdateCommand.CommandTimeout = 120;
daTmp.DeleteCommand = cb.GetDeleteCommand();
daTmp.DeleteCommand.Transaction = trans;
daTmp.DeleteCommand.CommandTimeout = 120;
daTmp.Update(dtToWrite);
trans.Commit();
}
catch (OdbcException ex)
{
trans.Rollback();
throw ex;
}
}
}
}
odbcConn.Close();
}
}
希望这可以帮助。
newTable 上的主键是必需的,否则您可能会遇到 CommandBuilder 异常。
BR
锡拉克