2017-07-26 56 views
0

我想使用DataSet更新访问数据库。 DataSet读取一个xml,然后使用DataAdapter Update函数的更新尝试更新数据库。使用数据集,从XML文件datadapter更新任何数据源

下面是代码

OleDbConnection connection = new OleDbConnection(this.ConnectionString); 
    connection.Open(); 
    var adapter = new OleDbDataAdapter("SELECT TOP 1 * FROM Customer", connection); 
    adapter.ContinueUpdateOnError = true; 
    var dataSet = new DataSet(); 
    dataSet.ReadXml("Update.xml"); 
    OleDbCommandBuilder commandBuilder = new OleDbCommandBuilder(adapter); 
    foreach (DataRow row in dataSet.Tables[0].Rows) 
    { 
     row.AcceptChanges(); 
     row.SetModified(); 
    } 
    var result = adapter.Update(dataSet, "Customer"); 

这里是XML

<NewDataSet> 
    <Customer> 
    <ID>1</ID> 
    <CustomerName>Customer 1</CustomerName> 
    </Customer> 
    <Customer> 
    <ID>2</ID> 
    <CustomerName>Customer 2</CustomerName> 
    </Customer> 
</NewDataSet> 

(1,2)存在于Access数据库的ID。我试图更新它们.. 更新函数返回2,这是更新的行数,但我没有看到访问数据库中的更新。 ID字段是自动递增

但是,如果我运行下面的

foreach (DataRow row in dataSet.Tables[0].Rows) 
    { 
     row["CustomerName"] = "Hi"; 
    } 
    var result = adapter.Update(dataSet, "Customer"); 

然后,更新获取database.Please正确refelected帮助

回答

0

这使用的是该项目的一部分的Access数据库?获取访问数据库文件的属性 - 在项目构建时是否设置为“CopyAlways”?如果是这样,那么主项目目录中的访问数据库将被复制到每个构建的BIN目录中。您的应用程序可能会在BIN

更新DB

无论您正在寻找在DB在您的项目,发现没有变化(这是从来没有这是更新的数据库文件),或者你在BIN文件夹看在DB但没有意识到,每一次构建完成后,该文件被覆盖用干净的副本 - >看起来像没有变化得到保存应用程序

http://www.vbdotnetforums.com/showthread.php/18096-FAQ-quot-My-database-isnt-saving-changes-quot-or-quot-Changes-are-gone-when-I-restart-the-app-quot?p=54914#post54914

的连续运行之间。如果不是这种情况,我想那么问题可能会植根于数据表中行的版本。使用.NET反编译器查看dataadapter.Update方法的代码,并查看它是否以某种方式比较Row [由DataRowVersion索引]原始值和当前值。

或者可能是已构建的更新查询通过DataAdapter的(使用调试器当地人窗口来检查它)有某种形式的乐观并发的 - 这意味着它看起来像

UPDATE people SET name = @newName WHERE ID = @originalID and @name = @originalName 

如果@originalname参数充满了新的值(从XML文件),而不是数据库表中当前的值,那么查询会更新0条记录。乐观并发用于检测2人对同一行的更改,而逻辑基本上意味着如果DB中的行仍具有该oldValue,则只能将行从oldValue更改为newValue。当我们正常使用数据库时,数据集知道什么是原始值 - 这是我们从数据库下载的内容。当您设置新值时,DataSet知道这是新值,但仍旧记住旧值,以便它可以填写@oldName和@newName参数的(不同的)值,并且该查询正常工作,除非其他人在您之前更改了DB设法

虽然通常在哪里不对劲@oldValue用于这种情况下,DataAdapter的将抛出一个ConcurrencyViolation

我没有找到任何办法来关闭“更新命令影响的1个预计行0”乐观并发在DbCommandBuilder文档中,您必须自己用另一个没有使用@oldValue的模式覆盖UPDATE语句也可以

它可能是你最终以稍微不同的方式接近问题:

将所有数据库数据下载到表中,将xml读入另一个数据集,通过数据库中的其他数据集更新值循环,dataadapter.update来自DB

或者,更简单,从xml读取数据集,循环执行更新命令,直接对每行db执行更新命令