Einzelnen Beitrag anzeigen

Elvis

Registriert seit: 25. Nov 2005
Ort: München
1.909 Beiträge
 
Delphi 2010 Professional
 
#4

Re: Master-Detail Datenmanagement mit ADO.NET 1: Constraints

  Alt 12. Jan 2006, 18:45
Zitat von Phoenix:
Erm. Also wenn ich mein DataSet dazu anweise Dein Schema zu laden schmeisst mir das Exceptions um die Ohren dass es nur so kracht. Das kann also schonmal gar nicht funktionieren.
Falls es die IDE nicht verkraftet, kannst du immer noch direkt XSD.exe benutzen um deine DataSet Klasse generieren zu lassen.
Zitat:
Und wieso ist mein Schema unpassend? Natürlich habe ich relationale Daten: Wenn ich einen User lösche dann soll mir das DataSet dazu selbstverständlich alle zugehörigen Einträge aus der Texte-Tabelle mitlöschen. Und zwar automatisch.
Jain, du benutzt mit XML ein hierarchisches Format. Wenn du die Daten unnötig relational ablegst/ausliest müssen sie ständig zur Laufzeit den einzelnen Benutzern zugeordnet werden. Dadurch wird die XML Datei größer und du verbrätst zur Laufzeit unnötig Dampf.
Zitat:
Das geht natürlich nur, wenn das DataSet über die Relation dem Eintrag in der Benutzertabelle auch die Einträge in dier Texte-Tabelle zuordnen kann. Und wenn sich ein User authentifiziert, dann sollen auch nur seine Notizen angezeigt werden und nicht die von allen Usern.
Das geht sehr wohl, wenn man die Texte eines Benutzers als Element in den Typen packt. [msdata:IsNested="true"] macht das sogar einem dummen DataSet klar.

Ich habe das gerade mal ausprobiert und eine Mini-GUI zusammengeGUIt.
Das hier kommt dabei raus und lässt sich auch wieder einlesen: (siehe screenie)
XML-Code:
<?xml version="1.0" standalone="yes"?>
<dsTexte xmlns="phoenix.net/Benutzer">
  <Benutzer>
    <userId>a</userId>
    <Texte>
      <headline>eene</headline>
    </Texte>
    <Texte>
      <headline>meene</headline>
    </Texte>
    <Texte>
      <headline>muuh</headline>
    </Texte>
  </Benutzer>
  <Benutzer>
    <userId>b</userId>
    <Texte>
      <headline>1</headline>
    </Texte>
    <Texte>
      <headline>2</headline>
      <text>bla ba</text>
    </Texte>
    <Texte>
      <headline>3</headline>
    </Texte>
  </Benutzer>
  <Benutzer>
    <userId>c</userId>
    <Texte>
      <headline>4</headline>
    </Texte>
    <Texte>
      <headline>5</headline>
    </Texte>
    <Texte>
      <headline>6</headline>
    </Texte>
  </Benutzer>
</dsTexte>
Ich habe das Schema noch verändert so dass es Elemente statt Attribute benutzt. DataSets scheinen schlichtweg zu dämlich zu sein um sich an Attribute zu halten (Die generierte XML Datei war zwar wieder einlesbar aber furchtbar hässlich...)

XML-Code:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="dsTexte"
           targetNamespace="phoenix.net/Benutzer"
           xmlns:mstns="phoenix.net/Benutzer"
           xmlns="phoenix.net/Benutzer"
           xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
           attributeFormDefault="unqualified"
           elementFormDefault="qualified">
  <xs:element name="dsTexte"
              msdata:IsDataSet="true">
    <xs:complexType>
      <xs:choice minOccurs="0"
                 maxOccurs="unbounded">
        <xs:element name="Benutzer">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="userId"
                          type="xs:string"
                          minOccurs="1"
                          maxOccurs="1"/>
              <xs:element name="password"
                          type="xs:string"
                          minOccurs="0"
                          maxOccurs="1"/>
              <xs:element msdata:IsNested="true"
                          name="Texte"
                          minOccurs="0"
                          maxOccurs="unbounded">
                <xs:complexType>
                  <xs:sequence>
                    <xs:element name="headline"
                                type="xs:string"
                                minOccurs="1"
                                maxOccurs="1"/>
                    <xs:element name="text"
                                type="xs:string"
                                minOccurs="0"
                                maxOccurs="1"/>
                  </xs:sequence>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:choice>
    </xs:complexType>
    <xs:unique name="Constraint1">
      <xs:selector xpath=".//Benutzer" />
      <xs:field xpath="userId" />
    </xs:unique>
  </xs:element>
</xs:schema>
Ich habe es außerdem zum Test auch mal durch XSD von .Net 1.1 gejagt: Auch dort lief alles problemlos...
Delphi-Quellcode:
var ds := new dsTexte();
var fileName := 'Texte.xml';

ds.ReadXml(fileName);

for benutzer : dsTexte.BenutzerRow in ds.Benutzer do
begin
   Console.WriteLine(benutzer.userId);

   for text : dsTexte.TexteRow in benutzer.GetTexteRows() do
   begin
      Console.WriteLine('-> {0}', text.headline);

      if not text.istextNull() then
         Console.WriteLine('--> {0}', text.text);
   end;
end;

ds.WriteXml(fileName);
Output
a
-> eene
-> meene
-> muuh
b
-> 1
-> 2
--> bla ba
-> 3
c
-> 4
-> 5
-> 6


hui... schon wieder viel zuviel wegen einer Kleinigkeit getippt...
Miniaturansicht angehängter Grafiken
nested_dataset_857.png  
Robert Giesecke
  Mit Zitat antworten Zitat