2011-04-28 18 views
7

Tengo una tabla en SQL y una de sus columnas es un tipo de datos XML. ¿Cómo podré obtener su valor de SQL a ASP.NET (C#) de código subyacente? Quiero almacenarlo como un tipo Xml y no como un tipo de cadena porque necesito manipular los valores y los atributos dentro de él. Intenté conseguirlo y ponerlo en una variable de tipo cadena y lo que obtengo es algo como esto: AAYYYNYNYNStarLight. Me gustaría obtener esto en su lugar:¿Cómo obtener datos XML de una columna en una tabla SQL?

<ANSWERS> 
<Answer item="ddl_3">A</Answer> 
<Answer item="ddl_8">A</Answer> 
<Answer item="ddl_13">Y</Answer> 
<Answer item="ddl_16">Y</Answer> 
<Answer item="ddl_19">Y</Answer> 
<Answer item="ddl_22">N</Answer> 
<Answer item="ddl_26">Y</Answer> 
<Answer item="ddl_30">N</Answer> 
<Answer item="ddl_34">Y</Answer> 
<Answer item="ddl_38">N</Answer> 
<Answer item="ddl_42">StarLight</Answer> 
</ANSWERS> 

¿Cómo puedo hacerlo y poder manipular cada nodo? Soy un completo novato sobre XML y cualquier ayuda será muy apreciada. :)

Editar: limpió el xml

Respuesta

2

Asumo que está recibiendo los datos de SQL Server utilizando ADO.NET hacia arriba y no un ORM como Entity Framework. Si estoy leyendo la documentación here correctamente, las columnas XML están expuestas como XmlReader que puede recuperar utilizando el método GetSqlXml.

Una vez que tenga un XmlReader, puede cargarlo directamente en un XDocument utilizando el método Load.

Otra cosa que podría interesarle es que haya dos espacios de nombres XML diferentes, eche un vistazo a esta pregunta sobre la diferencia entre XDocument and XmlDocument.

+0

Comprobé el enlace sobre ese XDocument.Parse pero luego solo acepta string-type como parámetro. Y la columna que tengo es de tipo Xml. Si almaceno esto desde XML (tipo de datos SQL) a string xmlValue, todas las etiquetas xml habrán desaparecido. Entonces, cuando intenté usar XDocument.Parse (xmlValue), arroja un error "La cadena no fue reconocida como Uri válida". – Rome

+0

@Rome: Ah, he leído mal tu pregunta, déjame editarla. – R0MANARMY

+0

De hecho, tengo un problema al usar ese XmlReader porque tenemos una clase separada para todos los datos de acceso. Cuando intento con ese método recibo un "intento no válido de leer cuando el lector está cerrado". Creo que es porque después de que la clase de acceso a datos devuelve el resultado xml a código subyacente, la clase de acceso a datos cierra el XmlReader. De todos modos, gracias por contarme sobre XDocument. Me dio una solución alternativa. Almacenaré el documento XML en SQL como una cadena en lugar del tipo XML (que sé que no es una solución muy elegante). Luego, cuando lo recupere, usaré XDocument.Parse: D – Rome

2

Si haces algo como esto en su código C#, que sin duda va a leer el XML correctamente desde su base de datos:

// setup connection string and query statement 
string connStr = "server=(local);database=Test;integrated security=SSPI;"; 
string query = "SELECT XmlContent FROM dbo.XmlTest2 WHERE ID = @ID"; 

// wrap your SqlConnection and SqlCommand in using blocks... 
using(SqlConnection _con = new SqlConnection(connStr)) 
using(SqlCommand _cmd = new SqlCommand(query, _con)) 
{ 
    // setup parameter for _cmd 
    _cmd.Parameters.Add("@ID", SqlDbType.Int).Value = 1; 

    _con.Open(); 
    string contentsOfYourXml = (string)_cmd.ExecuteScalar(); 
    _con.Close(); 
} 

Cuando se pone esta cadena en una página ASP.NET, sin embargo, la ASP. NET runtime intentará una transformación XSL, y de forma predeterminada, si no especificas nada, XSLT simplemente devolverá todos los valores de los elementos -> esa es la cadena que muestra tu vista.

¡Pero leer de la base de datos definitivamente funciona bien! Una vez que tenga esa cadena que contiene todo su XML, puede hacer con él lo que quiera, manipularlo con Linq-to-XML o lo que sea.

1

Bueno, después de algunas investigaciones más intensas, pude responder mi propia pregunta. : D

Aquí es código:

private void ddl_Eval_SelectedIndexChanged (Object sender, System.EventArgs e) 
{ 
    //Response.Write(ddl_Eval.SelectedValue.ToString() + " " + "value: " + ddl_Eval.SelectedIndex); 

    dtEval = new DataTable(); 
    dtEval = data.GetEvaluation2(); 
    DataView dvEval = dtEval.DefaultView; 

    string xmlDoc = String.Empty; 

    foreach (DataRowView drvEval in dvEval) 
    { 
     if (drvEval.Row["EvaluationID"].ToString() == ddl_Eval.SelectedValue.ToString()) 
     { 
      xmlDoc = drvEval.Row["EvalAnswers"].ToString(); 
     } 
    } 

    XDocument xdoc = new XDocument(); 
    xdoc = XDocument.Parse(xmlDoc); 

    foreach (XElement child in xdoc.Root.Elements("Answer")) 
    { 
     Response.Write(child.Attribute("item").Value + " " + child.Value + "<br />"); 
    } 

} 

Ahora, yo soy capaz de obtener el valor de la respuesta y el valor del elemento de atributo. : D

Cuestiones relacionadas