Señores... pido las disculpas del caso, pero me veo en la necesidad de buscar ayuda entre ustedes, pues espero mas de alguno ya ha tenido este dolorcito de cabeza.
Tengo una aplicacion que en terminos generales todo va bien... resulta que mi aplicacioncilla, pretende ser una herramienta versatil para un DBA. Pero me pone en aprietos que cuando hago un select * a determinadas tablas, el evento dataadapter.fill se tarda demasiado en poblarme mi dataset.
La pregunta especifica es.... ¿que puedo hacer para poblar los dataset mas rapido?
'******** PEDAZO DE MI CODIGO ************************
ConnRecordset = New Npgsql.NpgsqlConnection(constr)
SQLQuery = SQLstr
operation_finished = False
dadapterPostGre = New Npgsql.NpgsqlDataAdapter (SQLQuery, ConnRecordset)
dadapterPostGre.MissingSchemaAction = MissingSchemaAction.AddWithKey
dadapterPostGre.MissingMappingAction = MissingMappingAction.Passthrough
dset = New DataSet
dtable = New DataTable
dtable = dset.Tables.Add('Table')
dadapterPostGre.Fill(dset, 'Table')
'**************************************
Por extraño que parezca, buscando en la web encontré una solución un tanto extraña pero funcionó. La idea es declarar dentro del cuerpo del stored procedure las variables que se van a utilizar para filtrar los datos en el where y no emplear directamente los parámetros de entrada. O sea, puenteando los filtros. No se bien por qué pero funciona. Este es el ejemplo de mi procedure:
ALTER PROCEDURE [dbo].[sp_SelParaConciliacion]
@nLegajo1 int,
@nTipo1 tinyint --1 Ver Ingresos Sin Egresos // 2 Ver Egresos Sin Ingresos
AS
BEGIN
SET NOCOUNT ON;
--Declaro variables de los mismos tipos empleados como parámetros
DECLARE @nLegajo int
DECLARE @nTipo tinyint
--Asigno los parámetros de entrada a las variables creadas
SET @nLegajo = @nLegajo1
SET @nTipo=@nTipo1
--Utilizo las variables creadas para filtrar los datos
SELECT nIdTabla AS CodigoTabla,
CASE WHEN @nTipo = 1 THEN HoraIngreso else HoraEgreso end AS Hora,
dbo.Fn_DiaDeLaSemana(CASE WHEN @nTipo = 1 THEN HoraIngreso else HoraEgreso end) AS Situacion
,CASE WHEN (SELECT COUNT(FP.nEstado)
FROM SisFichadasPlano FP
WHERE FP.nEstado = 1 and FP.nLegajo =@nLegajo
GROUP BY FP.nLegajo) > 0 THEN '( * )' ELSE '' END AS Automatico,
nIdTabla, 0 AS Checkeado
FROM SisFichadasPlano INNER JOIN
PerPefiles ON SisFichadasPlano.nLegajo = PerPefiles.sCodTango
WHERE nLegajo=@nLegajo
AND ((@nTipo = 1 and nIdRelojSalida= 0 and nIdRelojEntrada>0) or (@nTipo = 2 and nIdRelojEntrada= 0 and nIdRelojSalida>0))
AND SisFichadasPlano.nEstado = 0
AND PerPefiles.nEstado in(4,5,6)
ORDER BY nIdTabla
END