1

msアクセスからSQLサーバーにデータを挿入する必要があります。私の論理は次のとおりです。

  1. ms アクセスで名前のリストを取得します。

  2. 挿入前に外部キーとトリガーを無効にします。

  3. 各表を読んでください。

  4. SetAdded() メソッドで各行の RowState を変更します。

  5. 最後にコマンドビルダーを使用して挿入します

エラー

テーブルの 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);
        }
4

1 に答える 1

0

を使用FillSchema()して、データ アダプタが処理しているデータ型を正確に認識できるようにしてください。

OleDbDataAdapter.FillSchema("", SchemaType.Source)

Fill()データを取得するには、メソッドを呼び出す必要があります。

于 2013-02-13T20:40:13.180 に答える