Buenas gente,
 
Les comento la siguiente inquietud, a ver si a alguien se le presentó alguna 
vez y le encontró la vuelta.
 
Estamos trabajando con SQL Server, .NET 2.0, y Enterprise Library. El tema es 
el siguiente, el metodo "ExecuteXmlReader" del Data Application Block tiene 2 
overloads, uno para trabajar con una Transaction, y el otro no. El problema es 
el que trabaja sin transacciones:
 
public XmlReader ExecuteXmlReader(DbCommand command)
{
SqlCommand sqlCommand = CheckIfSqlCommand(command);
DbConnection connection = OpenConnection();
PrepareCommand(command, connection);
return DoExecuteXmlReader(sqlCommand);
}
 
Para usar este metodo, por ejemplo, yo tengo una capa de datos que tiene la 
siguiente funcion (ejecuta un Stored Procedure y devuelve el XML que retorna):
 
public XmlReader RunSPReturnXmlReader(string cSPName)[]
{)
    Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase db = 
(Microsoft.Practices.EnterpriseLibrary.Data.Sql.SqlDatabase)   
Microsoft.Practices.EnterpriseLibrary.Data.DatabaseFactory.CreateDatabase();

     System.Data.Common.DbCommand dbCommand = db.GetStoredProcCommand(cSPName);
    xmlReaderConsulta = sqlDataBase.ExecuteXmlReader(dbCommand);
   .......
   return xmlReaderConsulta;
}
 
El tema es que el XmlReader resultante, debe ser usado dentro del scope del 
Command, de otra forma no se puede cerrar la conexion (si cierro la conexion 
antes de iterar el Reader, se pierde la informacion) y la misma queda activa 
hasta que al Garbage Collector se le ocurra cortarla. Es decir, que tengo que 
leer el XmlReader dentro del mismo metodo que lo traigo para luego poder cerrar 
la Connection del Command, caso contrario, si yo llego a devolver ese XmlReader 
a una funcion superior (como es nuestro caso), pierdo el Command y ya no puedo 
cerrar la conexion.
 
Tampoco se pueden modificar los XmlReaderSettings porque el XmlReader es creado 
por el metodo interno al Framework.
 
Entonces, como hago para tener un XmlReader "desconectado" para poder 
devolverlo a una funcion superior y poder cerrar la conexion en mi capa de 
datos?
 
La unica solucion que encontre (porque XmlReader no puede ser clonado) es crear 
otro XmlReader, con sus propios XmlReaderSettings y hacer algo como...
 
System.Xml.XmlReaderSettings xmlReturnSettings = new 
System.Xml.XmlReaderSettings();
xmlReturnSettings.ConformanceLevel = System.Xml.ConformanceLevel.Auto;
xmlReturnSettings.ValidationType = System.Xml.ValidationType.None;
xmlReturnSettings.ValidationFlags = 
System.Xml.Schema.XmlSchemaValidationFlags.None;
xmlReturnSettings.CloseInput = true;
System.Xml.XmlReader xmlReaderDesconectado = System.Xml.XmlReader.Create(new 
System.IO.StringReader(FuncionSerializacion(xmlReaderConsulta)), 
xmlReturnSettings);
 
Donde la FuncionSerializacion devuelve el XML como un string... algo no del 
todo "limpio".
 
Alguien vio alguna vez algo similar? O estoy utilizando "mal" el Application 
Block? Lo he probado sin el mismo y con las conexiones y metodos del Framework 
directo y el problema es el mismo.
 
Alguna idea?
 
Saludos y Feliz Año,
 
Matias
 
_________________________________________________________________
Get into the holiday spirit, chat with Santa on Messenger.
http://imagine-windowslive.com/minisites/santabot/default.aspx?locale=en-us

Responder a