Laden...

Tabellen aus MSSQL auslesen und auf anderem Rechner einspielen?

Erstellt von Nachtwind vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.923 Views
N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 13 Jahren
Tabellen aus MSSQL auslesen und auf anderem Rechner einspielen?

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?

79 Beiträge seit 2005
vor 13 Jahren

Du hast dir deine Antwort eigentlich schon selbst gegeben.

Ein DataSet hat die Methoden WriteXml und entsprechend auch ReadXml

Ein DataTable kann das natürlich auch beides 😃

roses are #FF0000 violets are #0000FF
all my base are belong to you

N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 13 Jahren

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?

3.825 Beiträge seit 2006
vor 13 Jahren

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

N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 13 Jahren

Ah, danke. Mit einem Dataadapter hat es nun funktioniert. Meine Read() Geschichte war wohl auch ein Problem...

J
1.114 Beiträge seit 2007
vor 13 Jahren

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.

N
Nachtwind Themenstarter:in
118 Beiträge seit 2005
vor 13 Jahren

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.