Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.641 Beiträge
 
#1

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

  Alt 12. Jan 2006, 11:21
Datenbank: XML: .NET DataSet • Version: 1.1 • Zugriff über: ADO.NET
Ich steh grad vollkommen auf dem Schlauch, weil ich sowas schon lange nicht mehr gemacht hab und ich das einfach nicht mehr hinbekomme.

Was ich gerne hätte wäre eine kurze Erklärung (Schritt für Schritt) zu den Punkten wo ich Probleme habe.

Ich habe eine ASP.NET WebForms - Anwendung.
Dort will ich ein paar Daten zur Authentifizierung und zum Ablegen auf dem Webserver speichern und nutzen. Da ich aber keine Datenbank hintendran haben will habe ich mir gedacht, ich nutze nur das DataSet und dessen WriteXml / ReadXml bzw. WriteXmlSchmema / ReadXmlSchema Funktionalität.

Gedacht, getan: Ich habe nun ein WebForm mit einem DataSet und im DataSet habe ich folgende Tabellen definiert:

table Benutzer:
userId: String
password: String

table Texte:
userId: String
headline: String
text: String

Pflichtfelder: alle bis auf text.

Keys:
table Benutzer: userId
table Texte: userId und Headline als zusammengesetzter Primärschlüssel.

Hier das zugehörige Schema:
XML-Code:
<?xml version="1.0" standalone="yes"?>
<xs:schema id="dsTexte" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
  <xs:element name="dsTexte" msdata:IsDataSet="true" msdata:Locale="de-DE">
    <xs:complexType>
      <xs:choice maxOccurs="unbounded">
        <xs:element name="Texte">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="userId" type="xs:string" />
              <xs:element name="headline" type="xs:string" />
              <xs:element name="text" type="xs:string" minOccurs="0" />
            </xs:sequence>
          </xs:complexType>
        </xs:element>
        <xs:element name="Benutzer">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="userId" type="xs:string" />
              <xs:element name="password" type="xs:string" minOccurs="0" />
            </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:keyref name="user2texte" refer="Constraint1">
      <xs:selector xpath=".//Texte" />
      <xs:field xpath="userId" />
    </xs:keyref>
  </xs:element>
</xs:schema>
userId in der Tabelle TExte ist freilich ein Fremdschlüssel zur userId in der Tabelle Benutzer, so dass man Dateneinträge mit eigener headline einem User eindeutig zuordnen kann.

Nun scheitere ich jedoch schon daran, Daten initial einzutragen und zu speichern.

Ich will auf einer Admin-Page erstmal Benutzer anlegen können. Dazu habe ich mir dort 2 Text-Controls draufgepappt und einen Anlegen-Button, und die beiden TextControls mit DataBindings auf die Tabelle User gehängt. Im Quellcode des Speichern-Events steht:

Delphi-Quellcode:
procedure TWebForm1.btnAddUser_Click(sender: System.Object; e: System.EventArgs);
var
   tmp: DataRow;
begin
   tmp := dataSet.Tables['Benutzer'].NewRow;
   tmp['userId'] := txtUserId.Text;
   tmp['password'] := txtPassword.Text;
   dataSet.Tables['Benutzer'].Rows.Add(tmp);
   dataSet.WriteXml(page.MapPath('.') + '\.data.xml');
   dataSet.ReadXml(page.MapPath('.') + '\.data.xml');
   DataBind;
end;
Wenn ich nun schon das ausführe, dann speichert er mir die Daten zwar in einem Xml-File:

XML-Code:
<?xml version="1.0" standalone="yes"?>
<dsTexte>
  <Benutzer>
    <userId>test</userId>
    <password>test</password>
  </Benutzer>
</dsTexte>
Beim wieder einlesen der geänderten Datensätze schmeisst er mir jedoch folgende Exception:

Code:
Serverfehler in der Anwendung '/WebNotes'.
--------------------------------------------------------------------------------

Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen.
Beschreibung: Beim Ausführen der aktuellen Webanforderung ist ein unverarbeiteter Fehler aufgetreten. Überprüfen Sie die Stapelüberwachung, um weitere Informationen über diesen Fehler anzuzeigen und festzustellen, wo der Fehler im Code verursacht wurde.

Ausnahmedetails: System.Data.ConstraintException: Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen.

Quellfehler:


Zeile 88:    dataSet.Tables['Benutzer'].Rows.Add(tmp);
Zeile 89:    dataSet.WriteXml(page.MapPath('.') + '\.data.xml');
--> Zeile 90:    dataSet.ReadXml(page.MapPath('.') + '\.data.xml'); <--
Zeile 91:    DataBind;
Zeile 92: end;
 

Quelldatei: c:\inetpub\wwwroot\WebNotes\adminpage.pas   Zeile: 90 

Stapelüberwachung:


[ConstraintException: Einschränkungen konnten nicht aktiviert werden. Mindestens eine Zeile enthält Werte die die Einschränkungen non-null, unique or foreign-key verletzen.]
   System.Data.DataSet.FailedEnableConstraints()
   System.Data.DataSet.EnableConstraints()
   System.Data.DataSet.set_EnforceConstraints(Boolean value)
   System.Data.XmlDataLoader.LoadData(XmlReader reader)
   System.Data.DataSet.ReadXml(XmlReader reader, Boolean denyResolving)
   System.Data.DataSet.ReadXml(String fileName)
   adminpage.TWebForm1.btnAddUser_Click(Object sender, EventArgs e) in c:\inetpub\wwwroot\WebNotes\adminpage.pas:90
   System.Web.UI.WebControls.Button.OnClick(EventArgs e)
   System.Web.UI.WebControls.Button.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(String eventArgument)
   System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl, String eventArgument)
   System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
   System.Web.UI.Page.ProcessRequestMain()

 


--------------------------------------------------------------------------------
Versionsinformationen: Microsoft .NET Framework Version:1.1.4322.2032; ASP.NET-Version:1.1.4322.2032
Also: Wo habe ich da einen Bock geschossen und wo muss ich anlangen damit schonmal das geht?

Dann will ich in einem zweiten Schritt - und da steige ich auch aus - über eine DropDown Box aus den verfügbaren Headlines auswählen lassen. Allerdings eingeschränkt auf den aktuell angemeldeten Benutzer. Aber ich hab da schon ne Idee das über ne View und RowFilter zu machen, wenn das nicht klappt gibts da noch nen neuen Thread dazu.

Aber das hier wär schonmal wichtig, weil ich ich da echt nicht weiss woran es hängt.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat