Blogia
ÉL - GURÚ

Obtener un conjunto de tablas en un DataSet (.NET)

Si bien un DataAdapter crea varias tablas en el DataSet cuando encuentra múltiples conjuntos de resultados -tablas devueltas a una o varias consultas sql-, pueden existir casos en los que nos sea necesario obtener la misma funcionalidad en una consulta que devuelve el conjunto de resultado en el formato XML que devuelven las consultas ejecutadas con FOR XML. Por ejemplo la siguiente consulta SQL:

SELECT *
FROM [PLPC_Agrupacio]
FOR XML RAW, XMLDATA

Cuyo resultado será:

<Schema name="Schema3" xmlns="urn:schemas-microsoft-com:xml-data" xmlns:dt="urn:schemas-microsoft-com:datatypes">
<ElementType name="row" content="empty" model="closed">
<AttributeType name="PLPC_AgrupacioId" dt:type="i4" />
<AttributeType name="PLPC_ConvocatoriaId" dt:type="uuid" />
<AttributeType name="PLPC_CodiAgrupacio" dt:type="i4" />
<AttributeType name="PLPC_AgrupacioNom" dt:type="string" />
<attribute type="PLPC_AgrupacioId" />
<attribute type="PLPC_ConvocatoriaId" />
<attribute type="PLPC_CodiAgrupacio" />
<attribute type="PLPC_AgrupacioNom" />
</ElementType>
</Schema>
<row xmlns="x-schema:#Schema3" PLPC_AgrupacioId="40" PLPC_ConvocatoriaId="081F2367-1121-4804-B66A-DAA92A89F3C8"
PLPC_CodiAgrupacio="1" PLPC_AgrupacioNom="grup 1" />
<row xmlns="x-schema:#Schema3" PLPC_AgrupacioId="41" PLPC_ConvocatoriaId="081F2367-1121-4804-B66A-DAA92A89F3C8" PLPC_CodiAgrupacio="2" PLPC_AgrupacioNom="grup 2" />
<row xmlns="x-schema:#Schema3" PLPC_AgrupacioId="42" PLPC_ConvocatoriaId="081F2367-1121-4804-B66A-DAA92A89F3C8" PLPC_CodiAgrupacio="3" PLPC_AgrupacioNom="grup 3" />

Para ello utilizaremos un DataSet y el método ReadXml de este. Mediante el parametro mode, que es del tipo XmlReadMode -una enumeración-, le indicaremos que utilize el modo ReadSchema que lee cualquier esquema en línea y carga los datos de modo que si el DataSet ya contiene un esquema se agregan las nuevas tablas -se lanza una excepción si cualquier tabla del esquema en línea ya existe en el DataSet.

SqlConnection dataBaseConnection = null;
SqlCommand dataBaseCommand;
SqlDataReader dataBaseReader = null;
StringBuilder xmlResult = new StringBuilder();
DataSet result = new DataSet ();
System.IO.StringReader reader;

dataBaseConnection = new SqlConnection(connectionString);
dataBaseCommand = new SqlCommand("PLPC_SP_ObtenirAgrupacions", dataBaseConnection);
dataBaseCommand.CommandType = CommandType.StoredProcedure;
dataBaseCommand.Parameters.Add("@PLPC_ConvocatoriaId", SqlDbType.UniqueIdentifier).Value = convocatoriaId;

dataBaseConnection.Open();
dataBaseReader = dataBaseCommand.ExecuteReader();xmlResult.Append ("<root>");
while (dataBaseReader.Read())
{
    xmlResult.Append (dataBaseReader.GetString(0));
}

xmlResult.Append ("</root>");
reader = new System.IO.StringReader (xmlResult.ToString());
result.ReadXml (reader, XmlReadMode.ReadSchema);
dataBaseReader.Close();
result.Tables[0].TableName = "PLPC_Agrupacio";
dataBaseCommand.CommandText = "PLPC_SP_ObtenirPlans";
dataBaseCommand.CommandType = CommandType.StoredProcedure;
xmlResult.Remove (0, xmlResult.Length);
xmlResult.Append ("<root>");

dataBaseReader = dataBaseCommand.ExecuteReader(CommandBehavior.CloseConnection);
while (dataBaseReader.Read())
{
    xmlResult.Append (dataBaseReader.GetString(0));
}
xmlResult.Append ("</root>");
reader = new System.IO.StringReader (xmlResult.ToString());
result.ReadXml (reader, XmlReadMode.ReadSchema);
dataBaseReader.Close();
result.Tables[1].TableName = "PLPC_Pla";
result.DataSetName = "Convocatoria";

Con este metodo es necesario ejecutar varias consultas asi que estoy abierto a metodos mejores.

No hay que olvidar que las relaciones entre las tablas y las restricciones dentro del DataSet y las deberemos crear mediante código una vez devuelto el conjunto de resultados.

0 comentarios