Export celej databázy do XML súboru

Publikoval Michal Kočí dňa 3.1.2009 o 18:18 v kategórii .Net

Pri zmene domény blogu a s tým suvisiacim aj prechodom k inému poskytovateľovi webhostingu nastal problém - čo s dátami. Dáta som mal v databáze, avšak na webhostingu z nejakého neznámeho dôvodu odstránili webový prístup do databázy. Nevraviac o tom, že aj v dobe, kedy sa cez web dalo pristúpiť k dátam, tak sa nedali rozumne zazálohovať. Takže nakoniec som musel prísť na čo najjednoduchší spôsob, ako dáta dostať z jedného servera na druhý. Nakoniec sa ako najjednoduchší spôsob ukázal export dát do XML.

Vyexportované dáta som potom naimportoval do databázy lokálnej na mojom vývojovom stroji a pomocou aplikácie Microsoft SQL Server Database Publishing Wizard som už veľmi jednoducho vygeneroval SQL skript, ktorým som na novom hostingu dáta rýchlo a pohodlne naimportoval.

Ako teda čo najjednoduchšie vyexportovať dáta zo všetkých tabuliek do XML súboru? Mne sa ako najjednoduchší spôsob zdalo, použiť DataSet a jeho metódu WriteXml. Pred tým však samozrejme treba DataSet naplniť dátami zo všetkých tabuliek. Všetky tabuľky v MS SQL zistíme cez informačné view INFORMATION_SCHEMA.TABLES. Potom za použitia triedy SqlDataAdapter a jej metódy Fill dáta jednoducho dostaneme do DataSet-u.

Kód tejto jednoduchej rutiny potom bude nasledovný:

// napriklad "server=mssqlsrv;user id=uziatel;pwd=heslo;database=db"                                             

string cs = "CONNECTION_STRING";

 

// napriklad System.Web.HttpContext.Current.Server.MapPath("~/Export/Schema.xml")       

string fileName = "CESTA_K_SUBORU";

 

DataSet ds = new DataSet();

SqlCommand cmd = null;

SqlDataAdapter adapter = null;

List<string> tables = new List<string>();

 

using(SqlConnection conn = new SqlConnection(cs))

{

    conn.Open();

 

    cmd = new SqlCommand(

        "select table_name from information_schema.tables order by table_name",

        conn);

 

    using(SqlDataReader reader = cmd.ExecuteReader())

    {

        while(reader.Read())

        {

            tables.Add(reader.GetString(0));

        }

        reader.Close();

    }

 

    foreach(string table in tables)

    {

        string sql = string.Format("select * from {0}", table);

        adapter = new SqlDataAdapter(sql, conn);

        adapter.Fill(ds, table);

    }

 

    ds.WriteXml(fileName, XmlWriteMode.WriteSchema);

 

    conn.Close();

}                       

A do existujúcej ASP.Net aplikácie netreba tento kód ani tri krát zložito pridávať, stačí iba vytvoriť nový aspx súbor (napríklad WriteData.aspx) a kód vložiť do elementu script s atribútom runat s hodnotou server:

<%@ Page Language="C#"%>

<%@ Import Namespace="System.Collections.Generic"%>

<%@ Import Namespace="System.Data"%>

<%@ Import Namespace="System.Data.SqlClient"%>

 

<html>

    <head id="Head1" runat="server">

        <title>Export dat</title>

    </head>

 

   <body>

       <center>

                <form action="WriteData.aspx" method="post">

                        <h3>Export dat</h3>

 

                        <%

 

        // napriklad "server=mssqlsrv;user id=uziatel;pwd=heslo;database=db"                                             

        string cs = "CONNECTION_STRING";

 

        // napriklad System.Web.HttpContext.Current.Server.MapPath("~/Export/Schema.xml")       

        string fileName = "CESTA_K_SUBORU";

 

        DataSet ds = new DataSet();

        SqlCommand cmd = null;

        SqlDataAdapter adapter = null;

        List<string> tables = new List<string>();

 

        using(SqlConnection conn = new SqlConnection(cs))

        {

            conn.Open();

 

            cmd = new SqlCommand(

                "select table_name from information_schema.tables order by table_name",

                conn);

 

            using(SqlDataReader reader = cmd.ExecuteReader())

            {

                while(reader.Read())

                {

                    tables.Add(reader.GetString(0));

                }

                reader.Close();

            }

 

            foreach(string table in tables)

            {

                string sql = string.Format("select * from {0}", table);

                adapter = new SqlDataAdapter(sql, conn);

                adapter.Fill(ds, table);

            }

 

            ds.WriteXml(fileName, XmlWriteMode.WriteSchema);

 

            conn.Close();

        }                       

 

                        %>

 

                            Spustene

                </form>

       </center>

   </body>

</html>

Mohlo by ťa tiež zaujímať

Páčil sa ti príspevok?

Zdieľaj príspevok alebo si ho odlož na neskôr

Sleduj ma

Ak nechceš premeškať príspevky ako je tento, sleduj ma na Twitteri, alebo ak máš RSS čítačku, môžeš sledovať môj RSS kanál.