其实我的目的就是要“到同一个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="公制"/>
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); }
你把下面的代码下下去,看一下就可能啦
http://www.codeproject.com/dotnet/xmldataeditor.asp?target=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");
<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
SELECT MetrologyID, Code, MetrologyName FROM Metrology for xml auto<Metrology MetrologyID="0" Code="01" MetrologyName="英制"/><Metrology MetrologyID="1" Code="02" MetrologyName="公制"/>
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);
}
}
}
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
da.TableMappings.Add("Table","authors");
da.TableMappings.Add("Table1","titles");
da.TableMappings.Add("Table2","sales");
这样的代码,所以写XML的时候没有table名出来这样,问题就解决了谢谢
这算是最后一个小问题了,如果没有好的办法也就算了,我现在采用传入一个带分号分割的字符串进行处理,不过总是感觉挺怪的
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">
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">
你的那个问题不好回答,不知道你的数据库操作类是怎么实现的。
{
if (i > 0)
{
strTemp = "Table" + i;
}
else
{
strTemp = "Table";
}
myDataAdapter.TableMappings.Add(strTemp,strTableNameTemp);
i = i + 1;
}
比如里头有这样的方法public System.Data.DataSet SelectDataSetExchange(string p_strSQL,string p_strTableName)就可以利用来里头的connection直接返回DataSet了