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.