问题是这样的:OracleDataAdapter.Update(DataTable表);的时候遇到“违反唯一约束条件”这样的情况。现在先说说具体情况:我项目需要从一个数据库里面取出一张表,修改一些数据后,更新到远方一个相同表结构的数据库里面。现在我已经取出这样表,并且修改好了,分别增加了一些新行,和修改原来一些数据。然后把结构存放在一个XML中。
接着我来到远处服务器,重新构造回这个DataTable,现在我需要OracleDataAdapter.Update(DataTable表);这个表的时候,如果和需要更新的服务器数据有 相同的主键,那么就覆盖这条记录,而不是添加这记录(问题也就出在这里,因为一添加就有两个主键了)
我应该怎么做呢?代码如下:
 OracleDataAdapter ada = new OracleDataAdapter("select * from gg_gg", conn);
 OracleCommandBuilder cb = new OracleCommandBuilder(ada);
ada.Update(datatable);//这里的datatable 就是有着和gg_gg完全相同结构的一张表,是我从XML中重新构造出来的。
现在问题是:新的行会直接添加,但有相同主键的行就出错了,我想有相同主键的行就覆盖,我该怎么做?不管能不能解决,先谢谢大家!!

解决方案 »

  1.   

    那要判断啊。有存在的就UPDATE 那记录。不是INSERT。
      

  2.   

    批量更新 使用ada的话 那么我们先ada取得dataset,然后对dataset进行修改 删除等操作 然后ada.update的话 ada会根据datatable的列变化 去判断是否是更新还是插入。
    你这里的情况就是 可以加个 首先取得dataset 然后从xml里面取出数据 遍历下dataset 如果主键与xml里面的数据一致的话 就对datable里面的数据进行更新 不是的话则插入(这段逻辑 你自己用程序去写) 然后得到最新的datatable 然后在ada.update(datatable).
      

  3.   

    如果去删除原来的数据,那么就又要打开这个DataTable表一条一条记录去搜索,然后删除。但是这样很麻烦,有没有好点的办法呢??
      

  4.   

    DataSet和Datatable中的Row是有状态的。
    参考:
    DataRowState Enumeration
    http://msdn.microsoft.com/zh-cn/library/system.data.datarowstate.aspx你从xml构造的,应该状态都是Added而不是Modified。建议使用DataSet的WriteXml来写xml,并使用ReadXml来读取。
    public void WriteXml (
    string fileName,
    XmlWriteMode mode
    )
    mode传入DiffGramDiffGram的意思参考:
    http://msdn.microsoft.com/en-us/library/ms172088(v=vs.80).aspx以上只是根据msdn推断,没有经过测试
      

  5.   

    这样,大概和楼上的朋友方法一样,先去除原有的。谢谢你回答啊,,但是有没有更好的方法呢?我想OracleDataAdapter类应该有这样的机制,因为SQL有类似的方式直接更新的。谢谢你啊
      

  6.   

    自己解析xml,把数据取出。
    循环用SqlCommand去执行 Update sql语句了。