msアクセスからSQLサーバーにデータを挿入する必要があります。私の論理は次のとおりです。
ms アクセスで名前のリストを取得します。
挿入前に外部キーとトリガーを無効にします。
各表を読んでください。
SetAdded() メソッドで各行の RowState を変更します。
最後にコマンドビルダーを使用して挿入します
エラー
テーブルの 1 つのフィールド (Ms Access ) のデータ型は Date/Time です。しかし、それは時間値 NO DATE 部分しか得られませんでした。挿入中にエラーが発生します。" SqlDateTime オーバーフロー。1753 年 1 月 1 日午前 12:00:00 から 9999 年 12 月 31 日午後 11:59:59 の間である必要があります。"
データセット ビジュアライザーで、1899 年 12 月 30 日 1:01:01 AM の値を見ました。
それを解決する方法。
try
{
oleCon = new OleDbConnection();
oleCon.ConnectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\Client Work\Client Docs\Don\ABCMotor.mdb;User Id=admin;Password=;";
oleCon.Open();
dt = new DataTable();
dt = oleCon.GetSchema("tables");
sqlCon = new SqlConnection(@"Server=ACER-PC\SQLEXPRESS2008R2;Database=ABC;Integrated Security=SSPI;");
sqlCon.Open();
SqlCommandBuilder sqlCmdB = new SqlCommandBuilder();
sqlCmd = new SqlCommand();
SqlTransaction sqlTran;
sqlTran = sqlCon.BeginTransaction();
sqlCmd.Connection = sqlCon;
sqlCmd.Transaction = sqlTran;
sqlCmd.CommandText = "sp_msforeachtable";
sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? NOCHECK CONSTRAINT all");
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.ExecuteNonQuery();
sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.Transaction = sqlTran;
sqlCmd.CommandText = "sp_msforeachtable";
sqlCmd.Parameters.Clear();
sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? DISABLE TRIGGER all");
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.ExecuteNonQuery();
foreach (DataRow row in dt.Rows)
{
if (row["Table_Name"].ToString().StartsWith("MSys") == false)
{
oleDa = new OleDbDataAdapter("Select * from [" + row["Table_Name"] + "]", oleCon);
ds = new DataSet();
oleDa.Fill(ds);
if (ds.Tables[0].Rows.Count > 0)
{
sqlDa = new SqlDataAdapter("Select * from [" + row["Table_Name"] + "]", sqlCon);
sqlDa.SelectCommand.Transaction = sqlTran;
foreach (DataRow item in ds.Tables[0].Rows)
{
item.SetAdded();
}
sqlCmdB.DataAdapter = sqlDa;
sqlCmdB.GetInsertCommand();
sqlDa.Update(ds);
}
}
}
sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.Transaction = sqlTran;
sqlCmd.CommandText = "sp_msforeachtable";
sqlCmd.Parameters.Clear();
sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all");
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.ExecuteNonQuery();
sqlCmd = new SqlCommand();
sqlCmd.Connection = sqlCon;
sqlCmd.Transaction = sqlTran;
sqlCmd.CommandText = "sp_msforeachtable";
sqlCmd.Parameters.Clear();
sqlCmd.Parameters.AddWithValue("@Command1", "ALTER TABLE ? ENABLE TRIGGER all");
sqlCmd.CommandType = CommandType.StoredProcedure;
sqlCmd.ExecuteNonQuery();
sqlTran.Commit();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}