dポイントプレゼントキャンペーン実施中!

VB.NET2005で家計簿を作っています。
データの保存はXMLで行いたいと考えています。
DataSetにshishutuテーブルとShopテーブルをつくり、shishutuテーブルにはShopテーブルの主キーのデータを格納することで二つのテーブルを連携したいと考えています。

そこでデータ入力時に自動的に主キーを入力したいと思うのですが、Accessのようにオートナンバー型などがないので、一意のデータをどのように入れたらいいか悩んでいます。

Rows.Countでは、データを削除するとデータが重なるなど不具合も出てくるのではないかと思っています。

そこで
1. いつ、どの時点で
2. どのようなプロパティを参照にして
3. 一意のデータを作ればよいか?
についてやもしくは「そもそもXMLでは主キーを自動的に入れることは不向きで別に良い方法がある」などのご意見を伺いたいと思います。
なにか良い知恵がありましたらよろしくお願いします。

A 回答 (1件)

お世話になります。



XML というか、DataSet 内の
DataTable の AutoIncrement 列の作成方法ですよね。
こんな形で出来ると思います。
下の Button2 のコードを実行すると、
ID 列に 自動採番された値が入っていることが
確認できます。

■Dataset1.xsd (XML ビューで表示)
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema id="Dataset1" targetNamespace="http://tempuri.org/Dataset1.xsd" elementFormDefault="qualified"
  attributeFormDefault="qualified" xmlns="http://tempuri.org/Dataset1.xsd" xmlns:mstns="http://tempuri.org/Dataset1.xsd"
  xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="Dataset1" msdata:IsDataSet="true">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="element1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="ID" msdata:ReadOnly="true" msdata:AutoIncrement="true" type="xs:int" />
              <xs:element name="NAME" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:key name="Dataset1Key1" msdata:PrimaryKey="true">
      <xs:selector xpath=".//mstns:element1" />
      <xs:field xpath="mstns:ID" />
    </xs:key>
  </xs:element>
</xs:schema>

■使う側(Form 等)
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
  Dim ds As Dataset1 = New Dataset1
  Dim element1 As Dataset1.element1DataTable = ds.element1
  element1.Addelement1Row("aaa")
  element1.Addelement1Row("bbb")
  element1.Addelement1Row("ccc")
  element1.Addelement1Row("ddd")
  element1.Addelement1Row("eee")

  For Each row As Dataset1.element1Row In element1.Rows
    Console.WriteLine("ID:" & Convert.ToString(row.ID))
    Console.WriteLine("NAME:" & Convert.ToString(row.NAME))
  Next
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます。
現在テスト出来る状況ではないので試していませんが、まさしく私がイメージしていたものです。
自分でコードを書かなくてはならないと思い込んでいましたが、こんな便利なプロパティがあったとは知りませんでした。
本当に助かりました。

お礼日時:2006/08/22 11:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!