DataSet读入XML的关系(relation):错在哪里?(一晚上都没解决,郁闷中:(

Goofyyang 2003-07-15 10:21:52
今晚我一直为这样一个问题所困扰:自己编写一个XML文件,其中有两张表,这两张表之间创建有联系(relation)。我想在程序运行期间加载这个xml文件,把它读入到DataSet中,然后通过对控件的数据绑定,把这两张表的关系显示出来。整个过程并不复杂,我的主要代码如下:

private void Form1_Load(object sender, System.EventArgs e)
{
// load the XML file
try
{
ds.ReadXml(@"..\..\PubTitle.xml");
}
catch(Exception ex)
{
MessageBox.Show("Unable to read from PubTitle.xml\n"+ex.Message);
}

// bind the DataSet to Windows controls and display the relationship between two DataTables in DataSet
MessageBox.Show(ds.Relations.Count.ToString());
....
}


问题就出在上面最后的MessageBox.Show()那里(这一行只是为了调试方便而加上的),在这里显示出来的ds.Relations.Count竟然为0!也就是说DataSet无法正确读入XML文件中的关系。可是我在查看MSDN中DataSet.ReadXML()以及DataSet.ReadXMLSchema()的文档时,却说可以加载XML文件的表、关系、约束定义等,请问问题出在哪里?

附:我所用的XML文档结构(内容其实很少,就是一个publishers表,列有pub_id、pub_name、country字段;另有一个titles表,有title_id、title、type、pub_id字段,两表通过pub_id建立关系,其中publishers为主表,我在其它的程序中验证了这个XML文档是有效的):

<?xml version="1.0" standalone="yes" ?>
<xs:schema id="dsPubTitle" targetNamespace="http://www.tempuri.org/dsPubTitle.xsd" xmlns:mstns="http://www.tempuri.org/dsPubTitle.xsd" xmlns="http://www.tempuri.org/dsPubTitle.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" attributeFormDefault="qualified" elementFormDefault="qualified">
<xs:element name="ds" msdata:IsDataSet="true" msdata:Locale="zh-CN">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<xs:element name="publishers">
<xs:complexType>
<xs:sequence>
<xs:element name="pub_id" type="xs:string" />
<xs:element name="pub_name" type="xs:string" minOccurs="0" />
<xs:element name="country" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="titles">
<xs:complexType>
<xs:sequence>
<xs:element name="title_id" type="xs:string" />
<xs:element name="title" type="xs:string" />
<xs:element name="type" type="xs:string" />
<xs:element name="pub_id" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="titles_Constraint1" msdata:ConstraintName="Constraint1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:titles" />
<xs:field xpath="mstns:title_id" />
</xs:unique>
<xs:keyref name="Publisherstitles" refer="mstns:Constraint1">
<xs:selector xpath=".//mstns:titles" />
<xs:field xpath="mstns:pub_id" />
</xs:keyref>
<xs:unique name="Constraint1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:publishers" />
<xs:field xpath="mstns:pub_id" />
</xs:unique>
</xs:element>
</xs:schema>
...全文
51 12 打赏 收藏 举报
写回复
12 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
saucer 2003-07-16
if your xml has relation in it, DataSet.ReadXml will pick it up, notice the output, "Publisherstitles" is the relationship name
  • 打赏
  • 举报
回复
Goofyyang 2003-07-16
to saucer(思归, MS .NET MVP):

谢谢你!看来问题的关键是,在DataSet在读入XML(架构)后,如何让前者保持后者的架构。这个问题我今天还没法解决(至于程序本身,我用了一个其它的方法绕了过去)。我查看了MSDN中关于DataSet和XML关系的文档,可还是不得要领(文档中似乎只说了二者的关系,并没说如何实现),哪位大侠可以助我?真的谢谢!
  • 打赏
  • 举报
回复
saucer 2003-07-16
when you output your DataSet, call

DataSet.WriteXml("..", XmlWriteMode.WriteSchema);

so the schema will be in your xml too
  • 打赏
  • 举报
回复
Goofyyang 2003-07-16
哦,如果DataSet读入的是xsd文档,那么关系是会显示出来的。大家在实际应用中是这样吗?我感觉应该是读入xml的呀?仅仅是感觉,还请大家指教。

(虽然这是个不起眼的小问题,可我真觉得在这个过程中学到了东西:)
  • 打赏
  • 举报
回复
Goofyyang 2003-07-16
to saucer(思归, MS .NET MVP) :

我原样使用了你的代码,但出来的结果竟是:
2
publishers:3
titles:4

还是没有关系!难道是我的SDK安装得不对?我安装的是Visual Studio.NET 2002 企业版。

  • 打赏
  • 举报
回复
xuzhenhua21 2003-07-16
关注中
  • 打赏
  • 举报
回复
soulroom 2003-07-16
你可以用dataSet.ReadXMLSchema加载表的结构定义
用dataSet.ReadXml加载表的数据内容
  • 打赏
  • 举报
回复
soulroom 2003-07-16
你可以用dataSet.ReadSchema加载表的结构定义
用dataSet.ReadXml加载表的数据内容
  • 打赏
  • 举报
回复
soulroom 2003-07-16
ds.InferXmlSchema("TestData.xml");
  • 打赏
  • 举报
回复
saucer 2003-07-15
I tried your xml, it works fine

using System;
using System.Data;

class ReadData
{
public static void Main()
{
DataSet ds = new DataSet();
ds.ReadXml("TestData.xml");
Console.WriteLine(ds.Tables.Count);
foreach (DataTable dt in ds.Tables)
Console.WriteLine("{0}:{1}", dt.TableName, dt.Rows.Count);

foreach (DataRelation dr in ds.Relations)
{
Console.WriteLine(dr.RelationName);
}
}
}

output:
2
publishers:0
titles:0
Publisherstitles
  • 打赏
  • 举报
回复
Goofyyang 2003-07-15
可是按你说的也有问题,我试了在读入XML后创建关系,方法如下:
ds.Relations.Add("PubTitle", ds.Tables[0].Columns["pub_ID"], ds.Tables[1].Columns["pub_ID"]),

不过编译器在这一行上报错,称此处引用了空指针,是我写的不对还是ds结构预先不知的情况下无法引用其内部的表?望赐教!
  • 打赏
  • 举报
回复
雪狼1234567 2003-07-15
建议你反过来一下,先用DataSet引入两个表customers 和orders,然后定义它的关系relation,然后用dataset的writexml方法把它写入文件,然后你研究那个文件是怎样写的,我想就可以啦
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.7w+

社区成员

.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
申请成为版主
帖子事件
创建了帖子
2003-07-15 10:21
社区公告

让您成为最强悍的C#开发者