Probleme mit Xml
-
Hallo,
eins vorweg: Ich bin noch relativ ungeübt mit Xml und versuche eine Datenbankanwendung zu schreiben. Durch die Suchfunktion bin ich auch nicht schlauer geworden, daher hier mein Problem:
Ich habe eine Anwendung, in der am Amfang die Benutzernamen mittels XmlValidatingReader ausgelesen werden. Das funktioniert auch sehr gut, hier mein Code://Versuch Daten.xml einzulesen, wo alles gespeichert ist if(File.Exists("Daten.xml")) { //Es gibt bereits mind. 1 Benutzerprofil stream =new StreamReader("Daten.xml"); reader =new XmlTextReader(stream); valReader =new XmlValidatingReader(reader); valReader.ValidationType =ValidationType.Schema; valReader.Schemas.Add(schema); //Nun Datei einlesen und nach Benutzernamen suchen try { //lesen und nach UserName suchen while(valReader.Read()) { if(valReader.LocalName.Equals("UserName")) { userNameCB.Items.Add(valReader.ReadString()); } } //aufräumen valReader.Close(); reader.Close(); stream.Close(); } catch(XmlException exc) { MessageBox.Show(exc.ToString(), "Fehler!"); } catch(XmlSchemaException exc) { //Nichts tun: Dieser Fehler passiert, wenn schon ein Profil angelegt wurde aber //noch keine weiteren Datenelemente vorhanden sind } finally { valReader =null; reader =null; stream =null; } } else { //Es existiert noch kein Benutzer: newUser=true; }
man beachte, dass ich am Ende (nach meiner Logik :p ) alles schön aufgeräumt hab. Nun benutze ich eine andere Funktion, um wieder in dieses Dokument zu schreiben, nämlich mittels XmlTextWriter:
//Falls ein Name in das Feld eingetragen wird, der noch nicht angelegt war, //diesen in die Datei schreiben if(!(userNameCB.Items.Contains(userNameCB.Text))) { string newName=userNameCB.Text; //writer öffnen, damit neuer Account angelegt werden kann writer =new XmlTextWriter("Daten.xml", null); writer.Formatting =Formatting.Indented; //Datei neu-schreiben writer.WriteStartDocument(); //Header und Hauptelement schreiben writer.WriteStartElement("User"); writer.WriteAttributeString("xmlns", null, "http://tempuri.org/Kurse.xsd"); //schon vorhandene Accounts eintragen for(int i=0; i<userNameCB.Items.Count; i++) { writer.WriteStartElement("UserName"); writer.WriteString(userNameCB.Items[i].ToString()); writer.WriteEndElement(); } //neuen Benutzernamen hinzufügen writer.WriteStartElement("UserName"); writer.WriteString(newName); writer.WriteEndElement(); userNameCB.Items.Add(newName); //writer schließen writer.WriteEndElement(); writer.WriteEndDocument(); writer.Close(); }
So, hoffe da blickt man bisher noch durch
Mein Problem ist jetzt: Wenn ich den Writer nun, nachdem eingelesen wurde benutze, bekomme ich ständig eine System.IO.IOException, da die Datei noch in Verwendung sein soll. Aber wieso, ich hab den Reader doch ordnungsgemäß beendet...wieso beansprucht der immer noch die Datei?
Ah und noch was: Gibt es da elegantere Möglichkeiten sowas zu machen? (Hab da von XmlDocument etc gehört) Es kommt mir dumm vor jedes mal den Reader und Writer neu zu initialisieren...glaube ich mach da auch irgendwas falsch
Für jede Hilfe bedanke ich mich im Voraus.
MfG
Gaea
-
Ich habe mir das jetzt nicht ganz durchgelesen, nur eine Frage?
Wenn du eh eine Datenbankanwendung schreibst, die Daten in XML - Dateien ablegen willst, jedoch die gesamte Suchfunktionalität einer Datenbank haben möchtest, warum benutzt du nicht einfach ein Dataset? Denn auch hier kannst du die Daten aus XML-Dateien lesen und schreiben.
-
hm ok danke erstmal für die Antwort
Also wie gesagt, ich bin noch absoluter Anfänger in Datenbankprogrammierung; das Schreiben und Lesen von Xml-Datein habe ich aus dem Microsoft Buch zu Visual C#, da stand, dass man das so macht. Frage: Wie funktioniert das mit den Datasets?
MfG
Gaea
-
Beispiel für einen SQLServer:
SqlConnection conn = new SqlConnection("Server=(local);Database=DeinDatenbankName;[...]"); SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM ...", conn); DataSet ds = new DataSet(); da.Fill(ds, "TabellenName");
Daten von DataSet in XML:
ds.WriteXml(pfad);
Daten von XML in DataSet:
ds.ReadXml(pfad);
-
ok danke dann werde ich mich mal in Datasets einarbeiten
meine version kam mir auch schon komisch vor
MfG
Gaea
-
Ich habe genau das gleiche Problem wie Gaea, will aber nicht auf einen Datenbank zugreifen sondern nur Programmparameter in einer XML-Datei ablegen. Sobald ich die Methode zum ändern der XML-Datei aufrufe, kann ich nicht drauf zugreifen (selbe Fehlermeldung). Weiss jemand Rat?