2012-05-12 117 views
0

我有数据集与db连接。数据集和TableAdapterManager是由VS根据连接自动创建的。将数据集数据保存到其他数据库

我可以这样做this.tableAdapterManager.UpdateAll(testcheckerDataSet); 它的正常工作。

接下来,我(使用3D党数据库编辑器)已复制.db文件为“blank_testing.db”(第2分贝),然后从文件中删除所有数据。所以它只是没有数据的方案。

现在我(在代码中)填充数据集与来自“testchecker.db”(第1分贝)的数据,使用元素更改数据,并希望将数据保存到第2分贝然后到第1分贝。我尝试使每个适配器的连接字符串变为chaging。

string originalPath = tableAdapterManager.Connection.ConnectionString; 

     string ns = tableAdapterManager.Connection.ConnectionString.Replace("testchecker.db", "blank_testing.db"); 

     tableAdapterManager.Connection.ConnectionString = ns; 
     group_testingTableAdapter.Connection.ConnectionString = ns; 
     groupsTableAdapter.Connection.ConnectionString = ns; 
     testingTableAdapter.Connection.ConnectionString = ns; 


     this.tableAdapterManager.UpdateAll((testcheckerDataSet) testcheckerDataSet.Copy()); // here error 


     tableAdapterManager.Connection.ConnectionString = originalPath; 
     group_testingTableAdapter.Connection.ConnectionString = originalPath; 
     groupsTableAdapter.Connection.ConnectionString = originalPath; 
     testingTableAdapter.Connection.ConnectionString = originalPath; 

this.tableAdapterManager.UpdateAll(testcheckerDataSet); 

但我得到错误“并发违反updatecommand影响0从1”。我认为这是因为第二分贝根本没有数据。

所以有人能告诉我我该怎么当前的数据保存到另一个数据库文件,然后再以第一(原)分贝?

谢谢。这里

+1

根据需要来让我感动的数据量,我会尝试使用SqlBulkCopy的这一点。阅读 - http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlbulkcopy.aspx – dougajmcdonald

+0

适配器并不昂贵。只需创建新的实例。只需将记录复制到新表格中。 –

回答

2

问题是,当你调用UpdateAll方法是设法找到数据库和更新纪录。但在第二分贝没有记录。你可以尝试遍历DataTable中的所有DataRows,并使用DataRow.SetAdded()方法更改行的DataRowState,然后它会将记录视为新添加的记录。

一件事:
SetAdded只能在DataRow实例,其中RowStateUnchanged被调用。您可以致电DataSet致电AcceptChanges。然后RowState财产的各个DataRow也改变;添加和修改的行变为不变,并删除删除的行。现在您可以致电DataRow.SetAdded()

+0

谢谢。它工作正常。但请注意一件事。 拨打电话之前'Row.SetAdded()'循环,我们需要调用'DataSet.AcceptChanges()'为第2集,因为数据形式mordified如我一开始所说。否则它会抛出错误“SetAdded和SetModified只能在DataRow上使用不变的DataRowState调用。” –

+0

@PortnyaginMikhail是的,很高兴听到它以某种方式帮助你。更新我的答案以及你的发现。 – Damith