PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbank in XML Datei laden?



Threin
01.01.2014, 03:25
Hey,

ich versuche grade eine Datenbank in eine XML-Datei zu laden, allerdings funktioniert das nicht so ganz. Hier mal der komplette Code soweit:


MySqlConnection sql_connection = new MySqlConnection();
MySqlCommand sql_command = new MySqlCommand();
MySqlDataReader sql_reader;

private string Anmeldung_DB()
{
string Anmeldung_an_DB = "SERVER=localhost;" + "UID=Test;" +
"PASSWORD=Test;" + "DATABASE=test;";

return Anmeldung_an_DB;
}

private void dateiSpeichernXMLToolStripMenuItem_Click(object sender, EventArgs e)
{
sql_connection.ConnectionString = Anmeldung_DB();
sql_command.CommandText = "select * from Eintrag";
MySqlDataAdapter sql_adapter = new MySqlDataAdapter(sql_command);
MySqlCommandBuilder cmd_builder = new MySqlCommandBuilder(sql_adapter);
DataSet daten_aus_db = new DataSet();

sql_command.Connection = sql_connection;
sql_adapter.Fill(daten_aus_db, sql_command.CommandText);

try
{
sql_connection.Open();
sql_command.Connection = sql_connection;
sql_reader = sql_command.ExecuteReader();

while(sql_reader.Read())
{
daten_aus_db.WriteXml(@"E:\Datenbank.xml");
}
sql_connection.Close();
}
catch(Exception ex)
{
MessageBox.Show("Ein Fehler ist aufgetreten!\n\n" + ex.Message, "Fehler!",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Ich kriege keinen Fehler aber die Datei ist leer, es steht dort nur:

<?xml version="1.0" standalone="yes"?>
<NewDataSet />

Mein Ziel ist es, das die komplette Datenbank in der XML-Datei steht, diese besteht derzeit eh nur aus einer Tabelle und ca. 20 Datensätzen.
Diese würden da dann doch auch mit eingetragen werden oder sehe ich das falsch?

Christian Marquardt
01.01.2014, 08:49
Der MySqlDataReader liest einzelne Daten aus -> siehe dazu die Beschreibung unter MySQL

Das Dataset -sofern es das hier ist (http://msdn.microsoft.com/de-de/library/system.data.dataset%28v=vs.110%29.aspx) - kann ebenfalls Daten enthalten.

Jedoch mischt du hier zwei Zugriffstechniken (MS und MySQL-spezifisch). Dein Dataset enthält keine Daten (wo wird es gefüllt?) und der MySqlDataReader enthält die Daten und du iterrierst über diesen, aber du benutzt ihn nicht -> Siehe Zugriffsmethoden GetString, GetBytes usw.

Threin
01.01.2014, 19:24
Naja, ich habe das ganze jetzt mal umgebaut und ich denke, das Dataset die sinnvollere Methode ist, allerdings komme ich grad nicht weiter:


private void dateiSpeichernXMLToolStripMenuItem_Click(object sender, EventArgs e)
{
sql_connection.ConnectionString = Anmeldung_DB();
sql_command.CommandText = "select * from Eintrag";
DataSet daten_aus_db = new DataSet();
DataTable eintraege = new DataTable("Eintrag");
daten_aus_db.Tables.Add(eintraege);

try
{
sql_connection.Open();
sql_command.Connection = sql_connection;
sql_command.ExecuteNonQuery();

foreach(DataRow row in eintraege.Rows)
{
daten_aus_db.WriteXml(@"E:\Datenbank\Datenbank.xml");
}
sql_connection.Close();
}
catch(Exception ex)
{
MessageBox.Show("Ein Fehler ist aufgetreten!\n\n" + ex.Message, "Fehler!",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Jetzt fülle ich das Dataset ja mit der Datatable aber ich erhalt immer noch nichts. Keine Fehlermeldung und auch leider keine Datei.

Christian Marquardt
01.01.2014, 19:33
Der Zugriff erfolgt immer noch über die MySQL Komponenten (Verbindung herstellen, Select-Statement)

Bloß weil du nun weitere MS-Klassen definierst hast, haben die deshalb noch keine Verbindung zur DB und keine Daten. Woher sollte die Verbindung kommen?
Bei der Nutzung von MS-Klassen und WriteXML würden außerdem die im Dataset vorhandenen Daten komplett geschrieben werden. Eine Schleife wäre nicht erforderlich.

Wie wäre es, EINE Zugriffart zu nutzen und nicht zu mixen.....

EDIT

Des Weiteren ist es im Sprachgebrauch so, wenn eine Datei geschrieben wird, dass man "in die Datei schreibt". Deshalb heisst der Befehl auch WriteXML. Man schreibt also in eine XML-Datei und nicht man "läd eine XML-Datei". Das ist der gegenteilige Vorgang...das lesen

Threin
01.01.2014, 23:01
Hm, habe es jetzt hingekriegt.
Das mit der Beschreibung ist echt misslungen aber naja. Ist doch auch eine gültige Aussprache oder nicht?

Der Aufbau der xml datei sieht so aus:


<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Table>
<ID>1</ID>
<Vorname>Angelo</Vorname>
<Nachname>Kaids</Nachname>
usw ...
</Table>
</NewDataSet>

Die Datei könnte man doch jetzt auch einfach wieder in die DB laden oder brauch man dazu auch eine xsl datei?
Ich verstehe das nicht ganz, mit der Xsl datei. Brauch man die nur, wenn die Datenbank bzw. die Tabelle noch nicht steht?

Ich würde das jetzt so versuchen:


private void dateiÖffnenXMLToolStripMenuItem_Click(object sender, EventArgs e)
{
string path = @"E:\Datenbank\Datenbank.xml"; // Pfad zur Datei

DataTable tabelle = new DataTable("Eintrag");
DataSet daten_aus_datei = new DataSet();
try
{
FileStream file_stream = new FileStream(@"E:\Datenbank\Datenbank.xml", FileMode.Open, FileAccess.Read);
StreamReader stream_reader = new StreamReader(file_stream);
daten_aus_datei.ReadXml(sr);
}
catch (Exception ex)
{
MessageBox.Show("Es ist ein Fehler beim lesen aufgetreten!\n\n" + ex.Message, "Fehler!",
MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}

Dann wären die Dateien doch im Dataset daten_aus_datei oder?

Christian Marquardt
02.01.2014, 07:28
daten_aus_datei.ReadXml(sr);
Wer ist sr? Schon die IDE müsste das als Fehler anmerken?

Threin
02.01.2014, 14:09
Der sr ist eigentlich der StreamReader.
Hatte das wohl nach dem kopieren ins Forum geändert. :o