lunes, 2 de mayo de 2011

DbAdapter Timeout

Hace un tiempo tuve que implementar un desarrollo en particular, que hoy en dia se esta dejando de funcionar por un maldito timeOut, ya que este se conecta a una base de datos que se encuentra en Europa.

Ademas se debe usar una conexión "SQLOLEDB" si es en produccion ya que el servidor es muy antiguo.


primero implemente una regla no muy bonita pero funciona de maravilla.


public static DbDataAdapter GetDataAdapter(string query, String connectionString) {
if (connectionString.Contains("SQLOLEDB"))
return new OleDbDataAdapter(query, connectionString);
return new SqlDataAdapter(query, connectionString);
}


De esta forma se puede determinar si crear un SqlDataAdapter o un OLEDBadapter.

¿por que adapter y no comandos y conexiones?
principalmente como es un servidor remoto, el adapter solito maneja la conexión y nos permite pasar a un dataset. La implementacion seria :


var adapter = ConnectionStringClass.GetDataAdapter("select * from foo", ConnectionStrinString);
adapter.Fill(ds);
var total = ds.Tables[0].Rows.Count;
Log.Info("cantidad de registros -->" + total);
var reader = ds.CreateDataReader();


pero esto no es muy mágico, ahora cada dia es mas recurrente ver en los logs, de log4net caidas por timeout, Yo ya me estaba resignando a no usar dataset para despues crear un dataReader, peo pero el que busca siempre encuentra :D. la forma es muy simple.


var adapter = ConnectionStringClass.GetDataAdapter("select * from foo", ConnectionStrinString);
adapter.SelectCommand.CommandTimeout = _timeout;
adapter.Fill(ds);
var total = ds.Tables[0].Rows.Count;
Log.Info("cantidad de registros -->" + total);
var reader = ds.CreateDataReader();



La propiedad CommandTimeout de selectcomand es representada en segundos, y defecto son 30.






--
Atte.
Victor Hugo Saavedra
http://vhspiceros.blogspot.com

No hay comentarios:

Publicar un comentario