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? 😕


Anmelden zum Antworten