XMLで主キーを自動的に入力する方法

このQ&Aのポイント
  • VB.NET2005で家計簿を作っています。データの保存はXMLで行いたいと考えています。
  • DataSetにshishutuテーブルとShopテーブルをつくり、shishutuテーブルにはShopテーブルの主キーのデータを格納することで二つのテーブルを連携したいと考えています。
  • XMLでは主キーを自動的に入れることは不向きで別に良い方法があるなどのご意見を伺いたいと思います。
回答を見る
  • ベストアンサー

XMLで主キーを自動的に入力する方法

VB.NET2005で家計簿を作っています。 データの保存はXMLで行いたいと考えています。 DataSetにshishutuテーブルとShopテーブルをつくり、shishutuテーブルにはShopテーブルの主キーのデータを格納することで二つのテーブルを連携したいと考えています。 そこでデータ入力時に自動的に主キーを入力したいと思うのですが、Accessのようにオートナンバー型などがないので、一意のデータをどのように入れたらいいか悩んでいます。 Rows.Countでは、データを削除するとデータが重なるなど不具合も出てくるのではないかと思っています。 そこで 1. いつ、どの時点で 2. どのようなプロパティを参照にして 3. 一意のデータを作ればよいか? についてやもしくは「そもそもXMLでは主キーを自動的に入れることは不向きで別に良い方法がある」などのご意見を伺いたいと思います。 なにか良い知恵がありましたらよろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.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

gon_hunter
質問者

お礼

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

関連するQ&A

  • 「テーブルに主キーがありません。」というエラーが出て困ってます。

    VisualStudioでASP.NETをやってます。初心者です。 データグリッドの削除ボタンを押して行を削除したいのですが、 テーブルに主キーがありません。というエラーが出てしまいます。 テーブルに主キーはあるんですけれども、原因がわかりません。 Dim mytable As DataTable Dim myrow As DataRow Dim key As String SqlDataAdapter1.Fill(DataSet11) key = DataGrid1.DataKeys(e.Item.ItemIndex) mytable = DataSet11.Tables("テーブル名") ↓ここでエラーになるようです。 myrow = mytable.Rows.Find(key) myrow.Delete() ご存知の方いらっしゃいましたら、よろしくお願いします。

  • 外部キーだけのテーブル(主キーがない?)

    データベースのテーブルについておたずねします. 主キーがなくて,そのかわりに外部キー(と主キー以外の列)しか持たない テーブルも可能だと聞きました. テーブルには主キーが必ずあるものだと思っていましたが, どのような使いかたをするのでしょうか. どうやら,最初からデータがあるわけではなく, 追加されるタイミングがわからないデータを格納する場合に作っておく, ということらしいのですが,なんのことかよくわかりません. データベース関連書籍をいくつか調べましたが, 主キーのないテーブルの説明などは見当たりません. また,この悩ましい問題を与えてくれた知り合いに訊ねましたが, テーブル構成などの具体的なことは, 企業内のことなので,教えてもらえませんでした. 何か具体的な例を交えながらご説明いただければと思います.

  • 主キーの値を自動更新することはできますか

    Accessで、あるテーブルの主キーとなる列から、一対多の関係で別のテーブルがあります。 テーブル1 主キー a01  あああ a02  いいい a03  ううう … テーブル2 主キー  b01   a01 かかか b02   a05 ききき b03  a01 くくく … こういうイメージなのですが、あとから「a01」等を、全部「g01」などのように変えて、なおかつテーブル2のデータを更新することはできるでしょうか。

  • .net 複数の主キーを設定する方法

    VB2005、SQLServer2005環境です。 主キーの設定方法について教えて下さい。 主キーが一つの場合下記のように記述しますが、複数ある場合はどう記述すればよろしいですか? お願いします。 strsql = "SELECT * FROM Aテーブル" Dim comm As SqlCommand = New SqlCommand(strsql, Con) Dim dataadapter As SqlDataAdapter = New SqlDataAdapter(comm) Dim ds As DataSet = New DataSet() dataadapter.Fill(ds, "Aテーブル") Dim dt As New DataTable dt = ds.Tables("Aテーブル") '主キーの設定 dt.PrimaryKey = New DataColumn() {dt.Columns("コード1")}

  • 主キーの変更

    次のようなテーブルが存在します。レコードはあくまで参考の値です。主キーについては必ず一意の値になるようにしています。 代理店sample1がIDを紛失し、再発行を依頼された場合や,その下の顧客店やこきゃくがIDを紛失し、再発行をする場合に既存のデータをそのまま保持したまま主キーだけを変更して関連された他のテーブルに一斉に反映させるにはどうすればよいでしょうか? ここには記載していませんが顧客店IDやこきゃくIDに関連する別テーブルが10ほど存在します。 主キーが存在するレコードと重複していないかをまずチェックしてそこから基礎となるテーブルに書き換えを行いと考えているのですが、思考がそこで止まってしまっています。 よろしければアドバイスをよろしくお願いいたします。 代理店テーブル |代理店ID(主キー) |代理店名| |        aaaaa | sample1| |        bbbbb | sample2| 顧客店テーブル |代理店ID(主キー) |顧客店ID(主キー)|顧客店名| |        aaaaa |      a-00001| ○○1店| |        aaaaa |      a-00002| ○○2店| |        bbbbb |      b-00001| △△1店| |        bbbbb |      b-00002| △△2店| 顧客テーブル |顧客店ID(主キー) |      こきゃくID(主キー)| こきゃく名| |        a-00001|    a-20071015-00001| Aさん   | |        a-00002|    a-20071015-00002| Bさん   | |         b-00001|     b-20050915-00001| Cさん   | |        b-00002|    b-20050915-00002| Dさん   |

  • 主キーが二つないと、フォーム入力が思ったようにできないのか?

    こんばんは。 従業員の出入りが激しいため、従業員の入社時の「志望動機」と 「退社理由」をデータベースで残して 分析しようという試みのため、 入力用にフォームを作ったけどうまくいきません。 (1)社員基本情報テーブル(主キーは、社員コード。フィールドは、社員コード、氏名、入社日、退社日、部署) (2)入退社テーブルを新規に作成(主キーは社員コード。フィールドは志望動機、退社理由) (1)、(2)を社員コードで結合してクエリを作成しました。 このクエリを元に、フォームを作成しました。 こちらで作成したいフォームのイメージは 社員コードを入れると、氏名と部署、入社日、退社日が自動的に参照。 あとは志望動機と退社理由を入れる。 ところが、実際には 社員コードを入れても自動的に参照は行われず、ただ、一度フォームを閉じてもう一度開けるとそこには上記データが参照されてきます。 ちなみに、(2)で主キーを社員コードと志望動機の二つにすると うまくいったのです。 うまくいった理由も分からないですし、うまくいかなかった理由も分かりません。 これは何がどう悪くてこのようになっているのでしょうか?

  • フォームで主キー(No)を入力すると他の項目も自動的に表示

    ACCESS2000・フォームで主キー(No)を入力すると他の項目も自動的に表示させたい。 テーブルの構成は、以下のとおりです。 データベース名:報告書 テーブルA          | フォームA  フィールド1(数値)    |  フィールド1(数値)  フィールド2(テキスト)  |  フィールド2(テキスト)  フィールド3(テキスト)  |  フィールド3(テキスト) テーブルB          | フォームB  フィールド1(数値)    |  フィールド1(数値)  フィールド2(テキスト) |  フィールド2(テキスト)   フィールド3b(テキスト) |  フィールド3b(テキスト) 主キーはフィールド1です。 リレーションを組んでおり、テーブルAからテーブルEまでのフィールドは同じ物ならば(フィールド1=フィールド1のように)リレーションを設定しています。 これをフォーム上ででフィールド1(主キー)を入力すれば、他のフィールド2、フィールド3~も自動表示され、他のフォームもフィールド1(主キー)を選択すれば表示されるようにしたい。 ユニオンクエリなどを使うべきなのでしょうか? どなたか回答、宜しくお願いします。

  • Access 主キーについて

    Accessでテーブルを作りCSVファイルをテーブルへ読み込みました。その時は主キーを設定しませんでした。1000件あるデータは1000件分読み込めました。 次にテーブルのデータを消して、主キーを2フィールドに設定して、同じように1000件分のデータを読み込んだら950件分しか読み込めませんでした。これは50件は重複するデータがありますよということなのでしょうか?

  • 登録したレコードの主キーの取得方法

    主キーに自動インクリメント( nextval )を使用しているテーブルで、 そこにレコードを登録したときにそのとき使われた主キー を取得する方法はありますでしょうか。 例えば 主キー|データ 1|AAA 2|BBB 3|CCC にDDDと登録したら恐らくは4になるのですが、 主キー|データ 1|AAA 2|BBB 3|CCC 4|DDD ←追加された データを登録したときにその主キーに何が使われたかが知りたいです が知りたいです。 自分で考えてる方法は今の主キーで使ってるシーケンス+1が割り当てられる(だろう)というやり方なのですが、複数のレコード登録が同時にあった場合に不整合が起きるのでどうしたものかと困ってます。 なにか良い方法をご存知の方いらっしゃいましたらお教えください。

  • 外部参照してるキーを主キーにすることは可能?

    DB設計について質問なんですが、テーブル1のA列を主キーとし、テーブル2のA列から外部キーでA列を参照したとします。 この時、テーブル2のA列を主キーとして設定することは可能なんでしょうか。 (テーブル2の方で列Aと列Bを組み合わせて主キーにしたいのです。要は二列でデータがユニークになるように設計したい) 使用しているDBはPostgreSQLです。 以上、宜しくお願い致します。

専門家に質問してみよう