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