日期:2014-05-18  浏览次数:20400 次

DataSet读取XML所遇到的问题
客户端调用Web服务传入了一个包含数据的xml字符串,要将该xml里面的数据保存到数据库,Web服务如下.
C# code

 [WebMethod(Description = "保存上传的XML到数据库")]
    public int ReadXmlAndUpdate (string  xmlstr)
    {
        SqlConnection con = this.createConnection();//已经写好的数据库连接方法-此略
        {
            con.Open();
            DataSet ds = new DataSet();
            SqlDataAdapter da = new SqlDataAdapter("select top(1)* from t_unit where 1 = 2",con);//获取一个空的架构
            da.Fill(ds);
            ds = XmlStringReader.ReadXmlString(xmlstr);
            SqlCommandBuilder sqlCmdBuilder = new SqlCommandBuilder(da);
            da.Update(ds,"t_unit");
            ds.AcceptChanges();
            con.Close();
            return 1;
        }
}



问题出来了,xml包含的数据在数据库中不存在的时候(insert)。没有一点问题,但当xml的数据在数据库中有存在的时候,就会报错。。因为DS初始时是空的,所以
ds = XmlStringReader.ReadXmlString(xmlstr) 生成的全是insert语句或者最后update的时候调用的全是insert方法。就会出现保存错误,提示:主键不能重复。
Xml中可能包含10条左右的数据,也就是说可能存在既有更新的数据,又有插入的数据。请教:怎么处理??
PS:整个上传数据量大约在1000条左右,我在客户端把他们分成若干批上传,上一批xml处理完成之后才能进行下一次,所以,要求web服务端处理时间尽可能的要短。


------解决方案--------------------
这只能判断了,用ID,或编码之类的,存在就更新数量,不存在就是插入记录

不要用da.Update(ds,"t_unit");
ds.AcceptChanges();
就可以了
------解决方案--------------------
文章页数:[1]
其实非常简单,就是用sqldataadapter的update方法就行了。主要代码例如下所示: 
private void update() 



string link = configurationsettings.appsettings["link_local"].tostring(); 

sqlconnection conn = new sqlconnection(link); 



sqldataadapter da = new sqldataadapter("select order_id, contract from linhai", conn); 

dataset ds = new dataset(); 

da.fill(ds, "linhai"); 



da.updatecommand = new sqlcommand("update linhai set contract = @contract " + "where order_id = @order_id" , conn); 

da.updatecommand.parameters.add("@contract", sqldbtype.nvarchar, 15, "contract"); 

da.updatecommand.parameters.add("@order_id", sqldbtype.nvarchar, 15, "order_id"); 



ds.tables["linhai"].rows[0]["contract"] = "ppp"; 

da.update(ds.tables[0]); 

}
 
-------------------------------------

看看别人是如何使用sqldataadapter更新的!!!
------解决方案--------------------
up and study