C# OLEDB数据适配器不';t更新表

C# OLEDB数据适配器不';t更新表,c#,.net,ms-access,ado.net,oledbdataadapter,C#,.net,Ms Access,Ado.net,Oledbdataadapter,我在更新数据表时遇到问题。我现在做的是: 1) 从数据库加载数据(我们称之为“旧数据库” 2) 从其他数据库加载数据(我们称之为“新数据库”) 3) 清除新数据库中的所有数据 4) 将所有旧数据(来自旧数据库)合并到新数据库中 以下是我试图实现这一目标的方式: string oldDatabase = this.txtOldReport.Text; string newDatabase = this.txtNewReport.Text; strin

我在更新数据表时遇到问题。我现在做的是:

1) 从数据库加载数据(我们称之为“旧数据库”

2) 从其他数据库加载数据(我们称之为“新数据库”)

3) 清除新数据库中的所有数据

4) 将所有旧数据(来自旧数据库)合并到新数据库中

以下是我试图实现这一目标的方式:

        string oldDatabase = this.txtOldReport.Text;
        string newDatabase = this.txtNewReport.Text;
        string backupFolder = @"C:\Planit\Report Updater\Backups";

        if ( !Directory.Exists ( backupFolder ) ) {
            Directory.CreateDirectory ( backupFolder );
        }

        string fullPath = Path.Combine ( backupFolder, string.Format ( @"Update Backup_{0}_{1}_{2}_{3}_{4}_{5}",
                                                                       DateTime.Now.Year,
                                                                       DateTime.Now.Month,
                                                                       DateTime.Now.Day,
                                                                       DateTime.Now.Hour,
                                                                       DateTime.Now.Minute,
                                                                       DateTime.Now.Second) );

        Directory.CreateDirectory ( fullPath );

        File.Copy ( oldDatabase, Path.Combine ( fullPath, @"Old Report.mdb" ) );
        File.Copy ( newDatabase, Path.Combine ( fullPath, @"New Report.mdb" ) );

        OleDbConnection oldConnection = new OleDbConnection ( string.Format ( @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", oldDatabase ) );
        OleDbConnection newConnection = new OleDbConnection ( string.Format ( @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0}", newDatabase ) );
        OleDbCommand oldCommand = oldConnection.CreateCommand ( );
        OleDbCommand newSelectCommand = newConnection.CreateCommand ( );

        oldCommand.CommandText = @"SELECT * FROM Reports";
        newSelectCommand.CommandText = @"SELECT * FROM Reports";

        oldConnection.Open ( );
        newConnection.Open ( );

        DataSet oldDataset = new DataSet ( );
        DataSet newDataset = new DataSet ( );

        OleDbDataAdapter oldAdapter = new OleDbDataAdapter ( oldCommand );
        OleDbDataAdapter newAdapter = new OleDbDataAdapter ( newSelectCommand );

        OleDbCommandBuilder builder = new OleDbCommandBuilder ( newAdapter );

        builder.QuotePrefix = "[";
        builder.QuoteSuffix = "]";

        newAdapter.UpdateCommand = builder.GetUpdateCommand ( true );
        newAdapter.InsertCommand = builder.GetInsertCommand ( true );
        newAdapter.DeleteCommand = builder.GetDeleteCommand ( true );

        oldAdapter.Fill ( oldDataset );
        newAdapter.Fill ( newDataset );

        newDataset.Tables [ 0 ].Rows.Clear ( );

        // removed for a response below
        //foreach ( DataRow dr in newDataset.Tables [ 0 ].Rows ) {
        //    dr.Delete ( );
        //}

        foreach ( DataRow dr in oldDataset.Tables [ 0 ].Rows ) {
            dr.SetAdded ( );
            newDataset.Tables [ 0 ].ImportRow ( dr );
        }

        // removed for the response below
        //newDataset.AcceptChanges ( );

        newAdapter.Update ( newDataset.Tables [ 0 ] );

        oldConnection.Close ( );
        newConnection.Close ( );

    }   
有人能看到我的问题吗?当我调用“newAdapter.Update”时,什么都没有发生

谢谢你的帮助。

调用AcceptChanges时,任何DataRow对象仍处于编辑模式 成功结束其编辑。DataRowState也会更改:全部已添加 修改的行将保持不变,删除的行将被删除

那么这条线

  newDataset.AcceptChanges ( );
从导入的表中删除添加的行状态,并且当您调用Update时,数据库中没有要添加的行,因为
newDataset
表中的每一行的状态都等于
Unchanged

因此,您只需删除它,然后再次调用您的
newAdapter.Update

作为补充说明,我认为您不需要循环使用newDataset.Tables[0]来删除每一行,因为您在紧靠前调用了
newDataset.Tables[0].Rows.Clear()

调用AcceptChanges时,任何DataRow对象仍处于编辑模式 成功结束其编辑。DataRowState也会更改:全部已添加 修改的行将保持不变,删除的行将被删除

那么这条线

  newDataset.AcceptChanges ( );
从导入的表中删除添加的行状态,并且当您调用Update时,数据库中没有要添加的行,因为
newDataset
表中的每一行的状态都等于
Unchanged

因此,您只需删除它,然后再次调用您的
newAdapter.Update


顺便说一句,我认为您不需要在newDataset.Tables[0]上循环以删除每一行,因为您在

之前调用了
newDataset.Tables[0].Rows.Clear()
,因此,我删除了
newDataset.AcceptChanges()
并删除了循环,但仍然没有发生任何事情。当我在更新之前中断时,我可以看到newDataset.Tables[0]中包含所有信息(在添加它们之前,所有数据都是不同的)。但是,它仍然没有实际更新数据库。您是否检查了是否设置了newAdapter.InsertCommand以及该命令是否有效?我对传递给GetInsertCommand的True参数有一些疑问。另外,您可以检查newDataSet表中的第一行是否添加了RowState=Added。添加了第一行并且InsertCommand是有效的命令。因此,我删除了
newDataSet.AcceptChanges()
并删除了循环,但仍然没有发生任何事情。当我在更新之前中断时,我可以看到newDataset.Tables[0]中包含所有信息(在添加它们之前,所有数据都是不同的)。但是,它仍然没有实际更新数据库。您是否检查了是否设置了newAdapter.InsertCommand以及该命令是否有效?我对传递给GetInsertCommand的True参数有一些疑问。您还可以检查newDataSet表中的第一行是否添加了RowState=Added。第一行已添加,InsertCommand是有效的命令。