try to useDataSet.WriteXml("FileName.xml",XmlWriteMode.WriteSchema)

解决方案 »

  1.   

    yes还要再生成一个schema文件与xml对应,到时两个文件同时读进ds, 就可以还原整个ds
      

  2.   

    哦,我又不得不收藏了。upup。
      

  3.   

    使用XmlDataDocument, XmlSchema我以前写的就是参考如下的代码,现在找不到啦,
    你把下面的代码下下去,看一下就可能啦
    http://www.codeproject.com/dotnet/xmldataeditor.asp?target=xml
      

  4.   

    用ds.WriteXml("file.xml", XmlWriteMode.WriteSchema)写一个xsd和xml组合在一起的xml文件
    读入时用
    ds.ReadXml("file.xml", XmlReadMode.ReadSchema);
    用ds.WriteSchema("file.xsd");ds.WriteXml("file.xml");分别写一个xsd和xml
    读入 
    ds.ReadXmlSchema("file.xsd"); ds.ReadXml("file.xml");
      

  5.   

    到同一个dataset的不同table中。
      

  6.   

    谢谢大家使用XmlWriteMode.WriteSchema增加了以下的描述<xs:element name="Employee_ID" type="xs:int" minOccurs="0" />
    <xs:element name="Code" type="xs:string" minOccurs="0" />
    <xs:element name="Name" type="xs:string" minOccurs="0" />
    <xs:element name="MetrologyID" type="xs:int" minOccurs="0" />
    <xs:element name="MetrologyName" type="xs:string" minOccurs="0" />
    <xs:element name="ShippingPropertyID" type="xs:int" minOccurs="0" />
    <xs:element name="VesselMain" type="xs:string" minOccurs="0" />
    <xs:element name="VesselAssistant" type="xs:string" minOccurs="0" />但是还是不行,ReadXml出来数据也是已经被改变了,生成了如下的一个Table,其中没有数据的地方被设置为null了,里头同样有Code  字段,被整合到同一列了Employee_ID   Code  Name   MetrologyID  MetrologyName  ShippingPropertyID  VesselMain  VesselAssistant
      

  7.   

    snof(雪狼) 的这个方法应该是可行,我现在还没有研究完,待我细细品尝,只怪我对XML没有多少了解,见笑了,欢迎给我更多的帮助,谢谢
      

  8.   

    其实我的目的就是要“到同一个dataset的不同table中”就不知道有没有更直接的方法例如使用直接在SQL语句中加入for xml auto就可以得到如下的内容,这里头直接就有表名存在
    SELECT MetrologyID, Code, MetrologyName FROM Metrology for xml auto<Metrology MetrologyID="0" Code="01" MetrologyName="英制"/><Metrology MetrologyID="1" Code="02" MetrologyName="公制"/>
      

  9.   

    如果是2个没有关联了的表,你可以写到2个xml文件里面吧?然后再分别读出来。
      

  10.   

    据我所知DATASET好像默认是把同名的元素组成一个表,所以我觉得可以加上一个父元素,这样就分开了。
      

  11.   

    show your code, or try
    using System;
    using System.Data.SqlClient;
    using System.Data;
    class TestMulti
    {
       public static void Main()
       {
    string sFileName = "MyTest.xml"; SqlDataAdapter da = new SqlDataAdapter("select * from authors; select * from titles; select * from sales",
    "server=localhost;database=pubs;uid=sa;pwd=;"); da.TableMappings.Add("Table","authors");
    da.TableMappings.Add("Table1","titles");
    da.TableMappings.Add("Table2","sales"); DataSet ds = new DataSet();
    da.Fill(ds); ds.WriteXml(sFileName, XmlWriteMode.WriteSchema); ds.Dispose();
    ds = null;
    ds = new DataSet();
    ds.ReadXml(sFileName);
    foreach (DataTable dt in ds.Tables)
    {
    Console.WriteLine("{0}, rowcount:{1}", dt.TableName, dt.Rows.Count);
    }

       }
    }
      

  12.   

    谢谢saucer(思归, MS .NET MVP) 大哥,我正在测试您给我的代码,以下是我的代码片断,因为我的整个程序中还有处理其余的部分,太长了不好贴,我的用途是把这些数据与PDA上同步,由于网络条件的限制,所以无法使用RDA方式,以前我在非.net的条件下做,采用的是一个文本的交换文件,里头融入了若干个表,我的程序自己做了分割,现在想用XML方式同步,就遇到这个问题了,或许有的人说为何不用若干个XML文件,但是这种方法在实际情况下并不适用,因为我的客户对文件操作并不怎么在行,也就是不会复制文件之类的,更不用说在屏幕很小的PDA上通过存储卡来了,所以只考虑用一个交换文件。谢谢大家写XML
    private void btnExport_Click(object sender, System.EventArgs e)
    {
    SQLServerWrapper SSWrapper = new SQLServerWrapper();
    System.Data.DataSet SelectValue;
                               //返回我所要的DataSet,就是包含若干个table的DataSet
    SelectValue = SWrapper.SelectDataSetExchange(); SelectValue.WriteXml("E:\\Temp\\Temp.XML",System.Data.XmlWriteMode.WriteSchema); }读取XML
    private void btnInport_Click(object sender, System.EventArgs e)
    {
    System.Data.DataSet SelectValue = new System.Data.DataSet(); SelectValue.ReadXml("E:\\Temp\\Temp.XML",System.Data.XmlReadMode.ReadSchema );
                               //定义DataGrid的列宽
    m_strWidth = "1;2;2";
                               //写DataGrid,只写SelectValue.Tables[0].DefaultView
    RefreshDataGrid(SelectValue);
    }结果:在DataGrid中显示出如下的列,记录条数是那几个返回的条数的累加,也就是8条记录,其中有两个表公用了code列,没有值得地方都写了Null
    Employee_ID   Code  Name   MetrologyID  MetrologyName  ShippingPropertyID  VesselMain  VesselAssistant
      

  13.   

    谢谢saucer(思归, MS .NET MVP) 大哥我知道的错在哪里了,我没有加入
    da.TableMappings.Add("Table","authors");
    da.TableMappings.Add("Table1","titles");
    da.TableMappings.Add("Table2","sales");
    这样的代码,所以写XML的时候没有table名出来这样,问题就解决了谢谢
      

  14.   

    我每次都是用da.fill(ds,"tablename"),所以没遇见缺少父元素的情况,也就没有楼主的问题了,呵呵~~~~
      

  15.   

    怪我的学业不精,原先你提到“父元素”我还没有明白过来是什么意思不过我市写在一个数据库操作类里头,也就是只要传SQL语句就可以返回想要的DataSet之类的,这样可以怎样方便地加入“父元素”?
      

  16.   

    不过我市写在一个数据库操作类里头,也就是只要传SQL语句就可以返回想要的DataSet之类的,怎样可以怎样方便地加入“父元素”?(不好意思,写错字了)
    这算是最后一个小问题了,如果没有好的办法也就算了,我现在采用传入一个带分号分割的字符串进行处理,不过总是感觉挺怪的
      

  17.   

    string i;
    string strTemp;
    string p_strTableName;
    p_strTableName = "Employee;Metrology;ShippingProperty"
    string[] strTableName = p_strTableName.Split(';');i = 0;foreach (string strTableNameTemp in strTableName)
    {
    strTemp = "Table" + i;
    myDataAdapter.TableMappings.Add(strTemp,strTableNameTemp);
    i = i + 1;
    }
    生成XML的时候为何第一个表名不是Employee而是Table?其余的都对
    <xs:element name="Table">
    <xs:element name="Metrology">
    <xs:element name="ShippingProperty">
      

  18.   

    而直接采用
    myDataAdapter.TableMappings.Add("Table","Employee");
    myDataAdapter.TableMappings.Add("Table1","Metrology");
    myDataAdapter.TableMappings.Add("Table2","ShippingProperty");就不会出错了<xs:element name="Employee">
    <xs:element name="Metrology">
    <xs:element name="ShippingProperty">
      

  19.   

    因为没有Table0这个映射呀! :)
    你的那个问题不好回答,不知道你的数据库操作类是怎么实现的。
      

  20.   

    我的问题,好低级的foreach (string strTableNameTemp in strTableName)
    {
    if (i > 0)
    {
    strTemp = "Table" + i;
    }
    else
    {
    strTemp = "Table";
    }
    myDataAdapter.TableMappings.Add(strTemp,strTableNameTemp);
    i = i + 1;
    }
      

  21.   

    数据库操作类就是写一个静态的connectionstring,建立一个静态的connection,然后就不用每次都去连接数据库建立connection了,
    比如里头有这样的方法public System.Data.DataSet SelectDataSetExchange(string p_strSQL,string p_strTableName)就可以利用来里头的connection直接返回DataSet了