これは、ある SQL Server から別の SQL Server へ、または DataFiles から SQL へのデータ移行シナリオで私が行うことです。
- 宛先 SQL Server に新しいテーブルを作成します (列名、主キーなど)。
- 既存のデータを DataTable にロードします (これは既に行ったことです)
- 次に、DataAdapter を使用して新しいテーブルを別の DataTable にクエリします (SQL テーブルをクエリすること以外は、Excel ファイルで行ったのと同じです)。
- 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 にインポートされます。(選択ステートメントでエイリアスを使用することで、マッピングを確実にすることができます)
既存のデータを新しいテーブルにロードした後、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 例外が発生する可能性があります。
ブラジル
セラク