verwendetes Datenbanksystem: MS SQL 2008
Hi,
Ich habe ein 'kleineres' Problem. Ich muss mehrere Tabellen an Rechner A aus einer Datenbank auslesen und in Rechner B einspielen. Ein direktes synchronisieren der Datenbanken geht nicht, auch ein Dump ist nicht möglich.. meine Idee wäre es die entsprechenden Daten auszulesen und in einer XML Datei zu speichern, die ich dann bei B wieder einlesen kann.. gibt es für das Abspeichern/Einlesen irgendwelche vorgefertigten Methoden im SQLClient? Also sowas wie Datatable.WriteXML?
Ok, habe auch gestern versucht diesen Weg einzuschlagen, jedoch ohne Erfolg.. mit folgendem Code habe ich es versucht:
public static void reader(){
.....
try
{
SqlDataReader myReader = null;
SqlCommand myCommand = new SqlCommand("select * from EXP_PROJECT_HOLE",
conn);
DataSet ds = new DataSet();
myReader = myCommand.ExecuteReader();
while (myReader.Read())
{
Console.WriteLine(myReader["HOLE"].ToString());
Console.WriteLine(myReader["SITE"].ToString());
}
ds = convertDataReaderToDataSet(myReader);
ds.WriteXml("hole.xml",XmlWriteMode.WriteSchema);
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
//////////////
/// <summary>
/// Converts a SqlDataReader to a DataSet
/// <param name='reader'>
/// SqlDataReader to convert.</param>
/// <returns>
/// DataSet filled with the contents of the reader.</returns>
/// </summary>
public static DataSet convertDataReaderToDataSet(SqlDataReader reader)
{
DataSet dataSet = new DataSet();
do
{
// Create new data table
DataTable schemaTable = reader.GetSchemaTable();
DataTable dataTable = new DataTable();
if (schemaTable != null)
{
// A query returning records was executed
for (int i = 0; i < schemaTable.Rows.Count; i++)
{
DataRow dataRow = schemaTable.Rows[i];
// Create a column name that is unique in the data table
string columnName = (string)dataRow["ColumnName"]; //+ "<C" + i + "/>";
// Add the column definition to the data table
DataColumn column = new DataColumn(columnName, (Type)dataRow["DataType"]);
dataTable.Columns.Add(column);
}
dataSet.Tables.Add(dataTable);
// Fill the data table we just created
while (reader.Read())
{
DataRow dataRow = dataTable.NewRow();
for (int i = 0; i < reader.FieldCount; i++)
dataRow[i] = reader.GetValue(i);
dataTable.Rows.Add(dataRow);
}
}
else
{
// No records were returned
DataColumn column = new DataColumn("RowsAffected");
dataTable.Columns.Add(column);
dataSet.Tables.Add(dataTable);
DataRow dataRow = dataTable.NewRow();
dataRow[0] = reader.RecordsAffected;
dataTable.Rows.Add(dataRow);
}
}
while (reader.NextResult());
return dataSet;
}
Wenn ich den Code nun ausführe (Converter snippet ist aus dem Internet, nicht von mir) dann wird eine XML Datei brav erstellt und sie enthält auch das Schema, welches zur Datenbank passt, aber es werden keine Daten abgelegt, obwohl sie existieren (und mit while (myReader.Read()) angezeigt werden).
Verstehe ich eventuell den Datareader falsch? Liest er Daten immer nur nach und nach ein? Dachte bislang er würde sich selbst mit daten befüllen bis die Quelle ausgelesen ist?
Hallo Nachtwind,
statt Deines langen Programmes würde ich den Befehl da.Fill(ds,..) benutzen, der macht nämlich das Gleiche.
Anscheinend sind in deinem Dataset keine Daten, wenn in der XML-Datei keine Daten sind.
Grüße Bernd
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
Ah, danke. Mit einem Dataadapter hat es nun funktioniert. Meine Read() Geschichte war wohl auch ein Problem...
v Ein direktes synchronisieren der Datenbanken geht nicht
Heisst das sie hängen nicht in einem Netzwerk?
Falls doch, nutze den Data Export des SQL Servers. Ansonsten kannst du auch ein Backup der gesamten DB ziehen, und auf Rechner B wieder in einer temp Datenbank aufspielen, und dein Data Export von dort aus erledigen.
Das ist eben das Problem. Die Systeme hängen nicht im selben Netzwerk UND die Daten von A sind nicht alle mit B vereinbar. Es geht um im endeffekt zwei Tabellen, die snychron gehalten werden müssen und nicht mehr ;0)
Aber ich denke, dass meine Lösung so jetzt funktioniert.