- PR -

XSDのキーの設定方法

1
投稿者投稿内容
ぷーちん
常連さん
会議室デビュー日: 2002/10/30
投稿数: 28
投稿日時: 2003-01-27 11:11
ぷーちんです。いつもお世話になっております。

XSDのキーの事で教えてください。

XSDでキーを指定し、それから生成したデータセットにデータを追加する場合、
キー項目が一致するデータがあったればExceptionを発生させるようにしたい
のですが、キーが同じデータを追加しても何も起きません。
XMLの設定方法に誤りがあるのか、元々Exceptionは発生しないのか
がわかりません。

以下の手順でプログラムを作成しました。
1.XSDファイルを作成
2.XSDからデータセットを生成
3.Formのデザインで画面に2で作成したデータセットを追加
4.Formのボタンクリックで3で追加したデータセットにキー項目が
 同じデータ2件を追加

<<Formのボタンクリック処理>>
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Try
Me.XmlSchema11.element1.Addelement1Row("111", "111")
'最初のデータと全く同じデータを追加
Me.XmlSchema11.element1.Addelement1Row("111", "111")
Catch ex As System.Exception
System.Diagnostics.Debug.WriteLine(ex.ToString)
End Try
End Sub


<<XMLSchema1のXML>> ※aaaをキー項目にしました。
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="XMLSchema2" targetNamespace="http://tempuri.org/XMLSchema2.xsd" elementFormDefault="qualified" xmlns="http://tempuri.org/XMLSchema2.xsd" xmlns:mstns="http://tempuri.org/XMLSchema2.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="element1">
<xs:complexType>
<xs:sequence>
<xs:element name="aaa" type="xs:string" />
<xs:element name="bbb" type="xs:string" />
</xs:sequence>
</xs:complexType>
<xs:key name="element1Key1" msdata:PrimaryKey="true">
<xs:selector xpath="." />
<xs:field xpath="mstns:aaa" />
</xs:key>
</xs:element>
</xs:schema>

長くてすみません。よろしくお願い致します。
ぷーちん
常連さん
会議室デビュー日: 2002/10/30
投稿数: 28
投稿日時: 2003-01-27 17:08
ぷーちんです。

データセットの項目の Unique を True にしたら一意制約のExceptionが発生しました。
このTrueを除いて出力に表示させたら、やはりFalseになっていました。

XSDスキーマで Key を設定してもデータセット作成時に Key でなくなってしまうようです。
どのようにすればXSDスキーマで設定した Key をデータセットにも有効にできるのでしょうか?

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

Try
'Me.XmlSchema11.element1.aaaColumn.Unique = True

Me.XmlSchema11.element1.Addelement1Row("111", "111")
Me.XmlSchema11.element1.Addelement1Row("111", "111")

System.Diagnostics.Debug.WriteLine(CStr(Me.XmlSchema11.element1.aaaColumn.Unique))
System.Diagnostics.Debug.WriteLine(CStr(Me.XmlSchema11.element1.bbbColumn.Unique))
Catch ex As System.Exception
System.Diagnostics.Debug.WriteLine(ex.ToString)
End Try

End Sub

引き続きよろしくお願い致します。
NothingButXMLInfoSet
大ベテラン
会議室デビュー日: 2002/07/16
投稿数: 116
投稿日時: 2003-01-27 18:51
xsd.exeにはいろいろ厳しい規約があるようで、次のようにしないといけないようです。

<xs:element name="NewDataSet" msdata:IsDataSet="true">
<xs:complexType>
<xs:choice maxOccurs="unbounded">
<!-- ここにぷーちんさんのelement1を挿入 ただしxs:key要素は除く -->
</xs:choice>
</xs:complexType>
<!-- ここにkey要素を挿入 selector/@xpathに注意 -->
<xs:key name="element1Key1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:element1" />
<xs:field xpath="mstns:aaa" />
</xs:key>
</xs:element>
ぷーちん
常連さん
会議室デビュー日: 2002/10/30
投稿数: 28
投稿日時: 2003-01-27 20:45
ぷーちんです。お世話になっております。

NothingBut.NETFXさんの通りの書き方でXSDを作成したところ、
データセットのunique設定ができました。

データセットを編集する際、最初に element を配置し、その element の
IsDataSet を true にしてから 各テーブル分の element を編集すれば良い
みたいですね。

ただ、VB.NETのデータセット編集画面から下の設定をする方法はわかりませんでした。
<xs:choice maxOccurs="unbounded">
編集画面だと choice の代わりに sequence になってしまいました。
<xs:sequence>
切り替え方はヘルプで見ましたが、Groupの方法しか見つけられなかったので、
XMLを開いてchoiceに変更しました。
sequence のままだと使い方がよくわかりません。
choice にすると私が書いたプログラムと同じ使い方ができました。

NothingBut.NETFXさん、どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)