Como leer un campo XML de SQL Server 2005 con C#

    El soporte nativo a XML de SQL Server 2005 es una de las caracteristicas más interesantes de la verisón. Cuando empezamos a trabajar con Xml nos encontramos con el problema de como leer los datos guardados en formato Xml de la base de datos, es decir, como obtener una instancia de XmlDocument a partir de una consulta a la base de datos.

    Para este ejemplo, lo primero que vamos a necesitar es una tabla con un campo de tipo Xml, para ello ejecutamos el siguiente script en nuestra base de datos.


CREATE
TABLE TABLA_CON_XML

(

Id int identity not null,

CampoXml Xml,

CONSTRAINT PK_TABLA_CON_XML PRIMARY KEY (Id)

)

     Para grabar datos en la tabla anterior necesitamos una segunda tabla con el objetivo de realizar una consulta posterior con la clausula FOR XML  de SQL Server 2005. La creamos con el siguiente script:


CREATE
TABLE INFO

(

Id int identity not null,

DbName varchar(100),

UserName varchar(100),

FxAlta datetime,

CONSTRAINT PK_INFO PRIMARY KEY (Id)

)

 

GO

 

INSERT INTO INFO

SELECT DB_NAME(), USER_NAME(), GETDATE()

    Con esto, grabamos un registro en nuestra tabla utilizando para ello una consulta con la clausula FOR XML.



DECLARE
@Xml Xml

set @Xml = (SELECT * FROM INFO

FOR XML AUTO, elements)

INSERT INTO TABLA_CON_XML

(CampoXml) VALUES (@Xml)


GO

 

SELECT * FROM TABLA_CON_XML

    La consulta debe haber generado un Xml como el que se muestra a continuación.


<
info>

<Id>1</Id>

<DbName>PRUEBAS</DbName>

<UserName>dbo</UserName>

<FxAlta>2007-08-13T11:07:11.077</FxAlta>

</info>

    Ahora ya podemos escribir el código C# necesario para acceder a la base de datos y recuperar el Xml.

    Lo primero que debemos hacer es importar los namespaces necesarios para trabajar con SQL Server y Xml.


using
System.Data.SqlClient;

using System.Data.SqlTypes;

using System.Xml;

    Para el ejemplo, hemos realizado una sencilla aplicación Windows en la que a través de una botón leemos el Xml de la base de datos y lo guardamos en disco.

 

private void button1_Click(object sender, EventArgs e)

{

XmlDocument doc = new XmlDocument();

string qs = @"Data Source=10.74.4.100;

Initial Catalog=PRUEBAS;

Persist Security Info=True;

User ID=sa;Password=xxxxxxxx";

SqlConnection conexion = new SqlConnection(qs);

conexion.Open();

LoadXml(conexion, doc);

conexion.Close();

doc.Save("C:\\OutputXml.xml");

}

    El código anterior, únicamente crea una instancia de XmlDocument y una conexion a nuestra base de datos. Es el método LoadXml el que realmente accede a la base de datos y obtiene el Xml.

    A continuación se muestra el método LoadXml:


protected
bool LoadXml(SqlConnection cn, XmlDocument doc)

{

//Leemos el Xml de la base de datos.

string sql = @"SELECT Id, CampoXml

FROM TABLA_CON_XML

WHERE Id = @Id";

SqlCommand cm = new SqlCommand(sql,cn);

cm.Parameters.Add(new SqlParameter("@Id",1));

using (SqlDataReader dr = cm.ExecuteReader())

{

if (dr.Read())

{

SqlXml mixml = dr.GetSqlXml(dr.GetOrdinal("CampoXml"));

doc.LoadXml( mixml.Value);

return true;

}

else

{

return false;

}

}

}

    Este método consulta la base de datos con un objeto SqlDataReader y almacena el resultado en una variable del tipo SqlXml (perteneciente al namespace System.Data.SqlTypes). Con este tan solo queda cargar nuestra instancia de XmlDocument con el valor del Xml leido de la base de datos a través de LoadXml.

    Como podemos ver, trabajar con C#, Xml y SQL Server 2005 es bastante sencillo.

    Saludos, DJK

Pedro  Herrarte  Sánchez
Leer un campo XML de SQL Server 2005 con C#
Pedro Herrarte Sánchez

Pedro Herrarte, es consultor independiente, ofreciendo servicios de consultoría, análisis, desarrollo y formación. Posee mas de diez años de experiencia trabajando para las principales empresas de España. Es especialista en tecnologías .NET, entornos Web (ASP.NET, ASP.NET MVC,jQuery, HTML5), bases de datos (SQL Server y ORACLE) e integración de sistemas. Es experto en desarrollo (C#, VB.Net, T-SQL, PL/SQL, , ASP, CGI , C, Pro*C, Java, Essbase, Vignette, PowerBuilder y Visual Basic ...) y bases de datos (SQL Server y ORACLE). Pedro es MCP y MAP 2012, es fundador, diseñador y programador de www.devjoker.com..
Fecha de alta:29/04/2008
Última actualizacion:29/04/2008
Visitas totales:28667
Valorar el contenido:
Últimas consultas realizadas en los foros
Últimas preguntas sin contestar en los foros de devjoker.com