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>
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.