Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Serializar Objetos en formato XML y enviar a SQL SERVER 2008

241 views
Skip to first unread message

Daniel Maldonado

unread,
Apr 28, 2010, 10:11:04 AM4/28/10
to
Estimados, estoy diseñando unos objetos con c# y necesito serializarlos para
enviarlos
a un Store Procedure en SQL Server.

Por Favor quien tiene algo implementado de esta forma ?.

Necesito una soga con este tema.

Probé varias cosas de la Web y ningúna me funciona.

Por favor.

Atte. Daniel.

Daniel Maldonado

unread,
Apr 28, 2010, 10:26:36 AM4/28/10
to

Alberto Poblacion

unread,
Apr 28, 2010, 10:53:55 AM4/28/10
to
"Daniel Maldonado" <ingdma...@gmail.com> wrote in message
news:OhCA$6t5KH...@TK2MSFTNGP02.phx.gbl...

> Estimados, estoy diseñando unos objetos con c# y necesito serializarlos
> para
> enviarlos
> a un Store Procedure en SQL Server.

Bueno, son dos temas totalmente independientes: Por una parte está la
pregunta de cómo se serializa un objeto para dar lugar a XML. Para esto se
puede usar la clase XmlSerializer.
El segundo problema sería cómo llamar a un procedimiento almacenado
pasándole un parámetro (que en este caso sería el XML pero a efectos de
hacer la llamada desde C# daría igual que fuera cualquier otro tipo de
información). Para esto se usa un SqlCommand junto con un SqlParameter.

¿Con cuál de las dos partes estás atascado? ¿Puedes concretar un poco más
en dónde encuentras la dificultad?

Daniel Maldonado

unread,
Apr 28, 2010, 12:01:57 PM4/28/10
to
Hola Alberto.
 
Específicamente estoy trabajando los objetos de mi aplicación hasta el momento de una forma muy CAVERNICOLA diría. porque por ejemplo
si tengo un objeto que tiene Cabecera y detalle estoy enviando por un lado la cabecera y por otro lado el detalle cuando talvez podría serializar el objeto
y enviar las dos cosas serializando el objeto XML y desde el otro lado descompongo ese XML y grabo cabecera y detalle de un solo tiro. Pero bueno, estoy intentando cambiar eso.
 
ahora bien, te paso el siguiente ejemplo.
 
Tengo una clase de prueba, muy estupida pero que sirve unicamente de ejemplo para este email
 

public class MiClaseSerializable

{

        public string strNombre;

        public string strApellido;

        public void MostrarNombre()

        {

            MessageBox.Show(" Nombre " + strNombre + " Apellido " + strApellido);

        }

}

de allí tengo otro pedazo de codigo que instancia un objeto de esa clase, lo serializa e intenta enviarlo como parametro tipo SQLXML.

 

DataSet DatosProyecto = new DataSet();

SqlConnection conConexionSQL = new SqlConnection("Data Source=HPMALDONADO\\SQL2008;Initial Catalog=DANIXML;Integrated Security=True");

conConexionSQL.Open();

MessageBox.Show(conConexionSQL.State.ToString());

MiClaseSerializable a = new MiClaseSerializable();

a.strNombre = "Daniel ";

a.strApellido = "Maldonado";

a.MostrarNombre();

// Aqui creo un objeto serializador //

XmlSerializer mySerializer = new XmlSerializer(typeof(MiClaseSerializable));

// Esto Serializa y enva el contenido a un archivo //

StreamWriter myWriter = new StreamWriter("myFileName.xml");

mySerializer.Serialize(myWriter, a);

// Esto serializa a una vabiable de memoria en C# que puede enviarse como parmetro a otra aplicacin //

StringWriter b = new StringWriter();

mySerializer.Serialize(b,a);

myWriter.Close();

MessageBox.Show(b.ToString());

 

// Todo esto para poder pasarlo como parmetro del Tipo SqlXML a un procedimiento almacenado //

MemoryStream Memo = new MemoryStream();

XmlWriterSettings settings = new XmlWriterSettings();

settings.OmitXmlDeclaration = true;

settings.ConformanceLevel = ConformanceLevel.Fragment;

settings.ConformanceLevel = ConformanceLevel.Auto;

settings.Encoding = Encoding.ASCII;

XmlWriter writer = XmlWriter.Create(Memo,settings);

writer.WriteString(b.ToString());

// Aqui voy a invocar al Procedimiento ALMACENADO //

SqlCommand Cmd = conConexionSQL.CreateCommand();

Cmd.CommandType = CommandType.StoredProcedure;

Cmd.CommandText = "insertarXML";

SqlXml ParametroSQLXML = new SqlXml(Memo);

Cmd.Parameters.AddWithValue("@XML", ParametroSQLXML);

int filas_afectadas = Cmd.ExecuteNonQuery();

MessageBox.Show("La cantidad de Filas Afectadas es: " + filas_afectadas.ToString());

 
ALBERTO: AL FINAL DE TODAS ESTAS PRUEBAS NO ME DEJA INVOCAR EL PARAMETRO.
 
ME DICE EL SIGUIENTE ERROR
 
La descripción del error es 'El documento XML debe tener un elemento de nivel superior.'.
No se encontró la instrucción preparada con el identificador 0.
Error de análisis de XML 0xc00ce558 en la línea número 0, junto al texto XML "".
Se terminó la instrucción.
 
Que estoy haciendo mal Alberto ?. Talvez tenga que probar de enviar los datos en formato texto en lugar
de en formato XML.
 
será lo mismo ?.
 
 
 
 
 
 
 
"Alberto Poblacion" <earthling-quitae...@poblacion.org> escribió en el mensaje news:Ot7ujKu5...@TK2MSFTNGP02.phx.gbl...

Hernan

unread,
Apr 28, 2010, 12:20:30 PM4/28/10
to
On 28 abr, 18:01, "Daniel Maldonado" <ingdmaldon...@gmail.com> wrote:
> Específicamente estoy trabajando los objetos de mi aplicación hasta el momento de una forma
> muy CAVERNICOLA diría. porque por ejemplo
> si tengo un objeto que tiene Cabecera y detalle estoy enviando por un lado la cabecera y por otro
> lado el detalle cuando talvez podría serializar el objeto
> y enviar las dos cosas serializando el objeto XML y desde el otro lado descompongo ese XML
> y grabo cabecera y detalle de un solo tiro. Pero bueno, estoy intentando cambiar eso.

Sin comentar tu diseño, ¿realmente necesitas que el tipo de datos sea
sqlxml? Debería ser
suficiente con un varchar(max).
También te recomiendo que pruebes primero si la serialización/
deserialización está bien hecha,
obviando el sqlserver en tus pruebas. Serializa a un string y
reconstruyes el objeto desde ahí.

-H.

Daniel Maldonado

unread,
Apr 28, 2010, 12:33:21 PM4/28/10
to
Si, Hernan. Coincido con vos.

Tambi�n se puede utilizar una variable del tipo text.

El tema es que por algo existe el tipo de Datos SqlXML en .NET

Debe tener sus ventajas respecto del varchar. Sabiendo que el varchar tiene
como m�ximo creo que 8000 caracteres.

si son XML grandes, objetos grandes voy a tener problemas.

por eso me gustar�a que algui�n comparta � me oriente mejor respecto de
serializar/desserializar objetos.

Sobre todo cuando quiero trabajar con SQL 2008.

Seguramente alguien tiene hecho algo � alg�n link que me oriente bien.

Saludos.

Daniel.

P/D: ley del �ltimo recurso utilizar una variable varchar � text. y si no se
puede, no se puede.

"Hernan" <hfof...@gmail.com> escribi� en el mensaje
news:53cadf68-4051-4439...@t15g2000vbo.googlegroups.com...


On 28 abr, 18:01, "Daniel Maldonado" <ingdmaldon...@gmail.com> wrote:

> Espec�ficamente estoy trabajando los objetos de mi aplicaci�n hasta el
> momento de una forma
> muy CAVERNICOLA dir�a. porque por ejemplo


> si tengo un objeto que tiene Cabecera y detalle estoy enviando por un lado
> la cabecera y por otro

> lado el detalle cuando talvez podr�a serializar el objeto


> y enviar las dos cosas serializando el objeto XML y desde el otro lado
> descompongo ese XML
> y grabo cabecera y detalle de un solo tiro. Pero bueno, estoy intentando
> cambiar eso.

Sin comentar tu dise�o, �realmente necesitas que el tipo de datos sea
sqlxml? Deber�a ser
suficiente con un varchar(max).
Tambi�n te recomiendo que pruebes primero si la serializaci�n/
deserializaci�n est� bien hecha,


obviando el sqlserver en tus pruebas. Serializa a un string y

reconstruyes el objeto desde ah�.

-H.


Hernan

unread,
Apr 29, 2010, 7:03:57 AM4/29/10
to
No cuestiono que exista para algo; solo dudo que sea lo que tu
necesitas ;-)
Y no lo necesitas porque, entre otras cosas, no creo que te interese a
validar
el XML de salida de la serialización contra un XSD; vamos, que eso no
lo hace
nadie.

varchar(max) permite superar el límite de los 8000, y eso fue lo que
te sugerí.
El tipo text es obsoleto.

Si lo único que necesitas es implementar persistencia, tampoco es
necesario
que la serialización sea XML. El BinaryFormatter es mas rápido y mas
compacto.
Pero en este caso la columna del sqlserver sería varbinary(max).


On 28 abr, 18:33, "Daniel Maldonado" <ingdmaldon...@gmail.com> wrote:
> Si, Hernan. Coincido con vos.
>

> También se puede utilizar una variable del tipo text.


>
> El tema es que por algo existe el tipo de Datos SqlXML en .NET
>
> Debe tener sus ventajas respecto del varchar. Sabiendo que el varchar tiene

> como máximo creo que 8000 caracteres.


>
> si son XML grandes, objetos grandes voy a tener problemas.
>

> por eso me gustaría que alguién comparta ó me oriente mejor respecto de


> serializar/desserializar objetos.
>
> Sobre todo cuando quiero trabajar con SQL 2008.
>

> Seguramente alguien tiene hecho algo ó algún link que me oriente bien.
>
> Saludos.
>
> Daniel.
>
> P/D: ley del último recurso utilizar una variable varchar ó text. y si no se
> puede, no se puede.
>
> "Hernan" <hfoff...@gmail.com> escribió en el mensajenews:53cadf68-4051-4439...@t15g2000vbo.googlegroups.com...


> On 28 abr, 18:01, "Daniel Maldonado" <ingdmaldon...@gmail.com> wrote:
>

> > Específicamente estoy trabajando los objetos de mi aplicación hasta el
> > momento de una forma
> > muy CAVERNICOLA diría. porque por ejemplo


> > si tengo un objeto que tiene Cabecera y detalle estoy enviando por un lado
> > la cabecera y por otro

> > lado el detalle cuando talvez podría serializar el objeto


> > y enviar las dos cosas serializando el objeto XML y desde el otro lado
> > descompongo ese XML
> > y grabo cabecera y detalle de un solo tiro. Pero bueno, estoy intentando
> > cambiar eso.
>

> Sin comentar tu diseño, ¿realmente necesitas que el tipo de datos sea
> sqlxml? Debería ser
> suficiente con un varchar(max).
> También te recomiendo que pruebes primero si la serialización/
> deserialización está bien hecha,


> obviando el sqlserver en tus pruebas. Serializa a un string y

> reconstruyes el objeto desde ahí.
>
> -H.

Daniel Maldonado

unread,
Apr 29, 2010, 7:13:03 AM4/29/10
to
Si Hernan. lo voy a tener en cuenta.

Serializaci�n binaria. si, tambi�n.

Comparto contigo.

Lo extra�o es que no consigo encontrar un ejemplo completo de
serializar/desserializar con .NET y SQL

manejando por supuesto el tipo de parametro SQLXml.

Hasta v� por ah� un SQLXMLCommand tambi�n.

hay tanto en .NET y muchas cosas sirven para lo mismo que realmente te
confunde.

hay tanto.

Saludos Hern�n.

Muchas gracias por tu comentario.

Atte. Daniel.

"Hernan" <hfof...@gmail.com> escribi� en el mensaje

news:d7906880-0124-43f1...@37g2000yqm.googlegroups.com...


No cuestiono que exista para algo; solo dudo que sea lo que tu
necesitas ;-)
Y no lo necesitas porque, entre otras cosas, no creo que te interese a
validar

el XML de salida de la serializaci�n contra un XSD; vamos, que eso no
lo hace
nadie.

varchar(max) permite superar el l�mite de los 8000, y eso fue lo que
te suger�.


El tipo text es obsoleto.

Si lo �nico que necesitas es implementar persistencia, tampoco es
necesario
que la serializaci�n sea XML. El BinaryFormatter es mas r�pido y mas
compacto.
Pero en este caso la columna del sqlserver ser�a varbinary(max).


On 28 abr, 18:33, "Daniel Maldonado" <ingdmaldon...@gmail.com> wrote:
> Si, Hernan. Coincido con vos.
>

> Tambi�n se puede utilizar una variable del tipo text.


>
> El tema es que por algo existe el tipo de Datos SqlXML en .NET
>
> Debe tener sus ventajas respecto del varchar. Sabiendo que el varchar
> tiene

> como m�ximo creo que 8000 caracteres.


>
> si son XML grandes, objetos grandes voy a tener problemas.
>

> por eso me gustar�a que algui�n comparta � me oriente mejor respecto de


> serializar/desserializar objetos.
>
> Sobre todo cuando quiero trabajar con SQL 2008.
>

> Seguramente alguien tiene hecho algo � alg�n link que me oriente bien.
>
> Saludos.
>
> Daniel.
>
> P/D: ley del �ltimo recurso utilizar una variable varchar � text. y si no

> se
> puede, no se puede.
>

> "Hernan" <hfoff...@gmail.com> escribi� en el

> mensajenews:53cadf68-4051-4439...@t15g2000vbo.googlegroups.com...
> On 28 abr, 18:01, "Daniel Maldonado" <ingdmaldon...@gmail.com> wrote:
>

> > Espec�ficamente estoy trabajando los objetos de mi aplicaci�n hasta el
> > momento de una forma
> > muy CAVERNICOLA dir�a. porque por ejemplo


> > si tengo un objeto que tiene Cabecera y detalle estoy enviando por un
> > lado
> > la cabecera y por otro

> > lado el detalle cuando talvez podr�a serializar el objeto


> > y enviar las dos cosas serializando el objeto XML y desde el otro lado
> > descompongo ese XML
> > y grabo cabecera y detalle de un solo tiro. Pero bueno, estoy intentando
> > cambiar eso.
>

> Sin comentar tu dise�o, �realmente necesitas que el tipo de datos sea
> sqlxml? Deber�a ser
> suficiente con un varchar(max).


> Tambi�n te recomiendo que pruebes primero si la serializaci�n/

> deserializaci�n est� bien hecha,


> obviando el sqlserver en tus pruebas. Serializa a un string y

> reconstruyes el objeto desde ah�.
>
> -H.


0 new messages