none
Very odd problem with DataAdapter.fill RRS feed

  • Question

  •  

    Hi,

     

      I have a web application written in C# (.NET 2.0) that access a SQL Server 2005 database. The application works fine except for one call to Adapter.Fill Method. The SelectCommand property of the adapter refers to a SQLCommand object, whose CommandType property refers to a stored procedure.

     

    Here is my problem : I get a timeout everytime I call the DataADapter.Fill method. The odd part of the problem is that when the procedure is executed in the Query Analyzer, it takes only a few seconds before the results are returned. Even odder, I got the same result by copying the T-SQL wihtin the stored procedure in another procedure with a different name.

     

    Any idea what's happening here?

     

    Friday, August 22, 2008 6:53 PM

All replies

  • Do you pass any parameters to your SP? Can you run SQL profiler to see what kind of command actually executed against your server? What is the name of your current stored procedure?

    Monday, August 25, 2008 11:48 PM
    Moderator

  • Thank you for your answer. Here is the procedure.

    I discovered that I can bypass the problem adding the WITH RECOMPILE option to the procedure, forcing SQL Server to recreate the execution plan. Is there another way to deal with this issue?


    CREATE PROCEDURE [dbo].[stpMyProc]
        @PageIndex INT = 0,
        @PageSize INT = 0,
        @OrderField VARCHAR(50) = NULL,
        @OrderDirection INT = NULL, -- 1 = ASC; 2 = DESC
        @TotalCount INT OUTPUT,
        @DateFinPeriode DATETIME = NULL,
        @StatutVenteID VARCHAR(50) = NULL,
        @TitresM BIT = NULL,
        @TitresExclusions BIT = NULL,
        @TitresInclusions BIT = NULL,
        @TitresVentes BIT = NULL,
        @InclureInventaire BIT = NULL,
        @TitresAvecErreurs BIT = NULL,
        @InclureVentesErreurs BIT = NULL,
        @Titre VARCHAR(502) = NULL,
        @Ean VARCHAR(19) = NULL,
        @Mode INT = 1, -- 1 = Page + Count; 2 = Export
        @TitreIDs VARCHAR(MAX) = NULL,
        @Delimiter CHAR = NULL


         WITH RECOMPILE

    AS

        SELECT ROW_NUMBER() OVER (ORDER BY
                                            CASE
                                                WHEN @OrderDirection = 1 AND @OrderField = 'Statut' THEN SV.StatutVente
                                                WHEN @OrderDirection = 1 AND @OrderField = 'EAN' THEN TI.EAN
                                                WHEN @OrderDirection = 1 AND @OrderField = 'Titre' THEN TI.Titre
                                            END ASC,
                                            CASE
                                                WHEN @OrderDirection = 2 AND @OrderField = 'Statut' THEN SV.StatutVente
                                                WHEN @OrderDirection = 2 AND @OrderField = 'EAN' THEN TI.EAN
                                                WHEN @OrderDirection = 2 AND @OrderField = 'Titre' THEN TI.Titre
                                            END DESC,
                                            -- INT
                                            CASE
                                                WHEN @OrderDirection = 1 AND @OrderField = 'TitreID' THEN TI.TitreID
                                                WHEN @OrderDirection = 1 AND @OrderField = 'NbDet' THEN CO.NbDet
                                                WHEN @OrderDirection = 1 AND @OrderField = 'QteDet' THEN ISNULL(SUM(VE.QteVenteDet), 0)
                                                WHEN @OrderDirection = 1 AND @OrderField = 'QteCol' THEN ISNULL(SUM(VE.QteVenteCol), 0)
                                                WHEN @OrderDirection = 1 AND @OrderField = 'QteTotale' THEN ISNULL(SUM(VE.QteVenteTotale), 0)
                                                WHEN @OrderDirection = 1 AND @OrderField = 'QteInv' THEN ISNULL(SUM(VE.QteInventaire), 0)
                                                WHEN @OrderDirection = 1 AND @OrderField = 'QteCom' THEN ISNULL(SUM(VE.QteCommande), 0)
                                                WHEN @OrderDirection = 1 AND @OrderField = 'QteRet' THEN ISNULL(SUM(VE.QteRetours), 0)
                                                -- DEFAULT SORT:
                                                WHEN @OrderField IS NULL OR @OrderField = '' THEN TI.TitreID
                                            END ASC,
                                            CASE
                                                WHEN @OrderDirection = 2 AND @OrderField = 'TitreID' THEN TI.TitreID
                                                WHEN @OrderDirection = 2 AND @OrderField = 'NbDet' THEN CO.NbDet
                                                WHEN @OrderDirection = 2 AND @OrderField = 'QteDet' THEN ISNULL(SUM(VE.QteVenteDet), 0)
                                                WHEN @OrderDirection = 2 AND @OrderField = 'QteCol' THEN ISNULL(SUM(VE.QteVenteCol), 0)
                                                WHEN @OrderDirection = 2 AND @OrderField = 'QteTotale' THEN ISNULL(SUM(VE.QteVenteTotale), 0)
                                                WHEN @OrderDirection = 2 AND @OrderField = 'QteInv' THEN ISNULL(SUM(VE.QteInventaire), 0)
                                                WHEN @OrderDirection = 2 AND @OrderField = 'QteCom' THEN ISNULL(SUM(VE.QteCommande), 0)
                                                WHEN @OrderDirection = 2 AND @OrderField = 'QteRet' THEN ISNULL(SUM(VE.QteRetours), 0)
                                            END DESC,
                                            -- Money
                                            CASE
                                                WHEN @OrderDirection = 1 AND @OrderField = 'MntDet' THEN ISNULL(SUM(VE.MntVenteDet), 0)
                                                WHEN @OrderDirection = 1 AND @OrderField = 'MntCol' THEN ISNULL(SUM(VE.MntVenteCol), 0)
                                                WHEN @OrderDirection = 1 AND @OrderField = 'MntTotal' THEN ISNULL(SUM(VE.MntVenteTotal), 0)
                                            END ASC,
                                            CASE
                                                WHEN @OrderDirection = 2 AND @OrderField = 'MntDet' THEN ISNULL(SUM(VE.MntVenteDet), 0)
                                                WHEN @OrderDirection = 2 AND @OrderField = 'MntCol' THEN ISNULL(SUM(VE.MntVenteCol), 0)
                                                WHEN @OrderDirection = 2 AND @OrderField = 'MntTotal' THEN ISNULL(SUM(VE.MntVenteTotal), 0)
                                            END DESC,
                                            -- DateTime
                                            CASE
                                                WHEN @OrderDirection = 1 AND @OrderField = 'DateFinPeriode' THEN @DateFinPeriode
                                            END ASC,
                                            CASE
                                                WHEN @OrderDirection = 2 AND @OrderField = 'DateFinPeriode' THEN @DateFinPeriode
                                            END DESC,
                                            -- BIT
                                            CASE
                                                WHEN @OrderDirection = 1 AND @OrderField = 'Publier' THEN
                                                    CASE WHEN SV.StatutVenteID IN (4, 2) THEN
                                                        CASE WHEN TT.NameValue IS NULL THEN 1 ELSE 0 END
                                                    ELSE
                                                        CASE WHEN TT.NameValue IS NULL THEN 0 ELSE 1 END
                                                    END
                                                WHEN @OrderDirection = 1 AND @OrderField = 'VerDisplay' THEN
                                                    CASE WHEN SUM(CASE WHEN VE.Erreur = 1 THEN 1 ELSE 0 END) > 1 THEN 1 ELSE 0 END
                                            END ASC,
                                            CASE
                                                WHEN @OrderDirection = 2 AND @OrderField = 'Publier' THEN
                                                    CASE WHEN SV.StatutVenteID IN (4, 2) THEN
                                                        CASE WHEN TT.NameValue IS NULL THEN 1 ELSE 0 END
                                                    ELSE
                                                        CASE WHEN TT.NameValue IS NULL THEN 0 ELSE 1 END
                                                    END
                                                WHEN @OrderDirection = 2 AND @OrderField = 'VerDisplay' THEN
                                                    CASE WHEN SUM(CASE WHEN VE.Erreur = 1 THEN 1 ELSE 0 END) > 1 THEN 1 ELSE 0 END
                                            END DESC
                                            ) AS RowNum,
                TI.TitreID, @DateFinPeriode AS DateFinPeriode,
                CAST(CASE
                        WHEN SV.StatutVenteID IN (4, 2) THEN
                            CASE WHEN TT.NameValue IS NULL THEN 1 ELSE 0 END
                        ELSE
                            CASE WHEN TT.NameValue IS NULL THEN 0 ELSE 1 END
                        END AS BIT) Publier,
                CAST(CASE WHEN SV.StatutVenteID IN (4, 2) THEN 1 ELSE 0 END AS BIT) PublierOrig,
                SV.StatutVenteID, SV.StatutVente Statut, TI.EAN, TI.Titre, CO.NbDet,

                ISNULL(SUM(VE.QteVenteDet), 0) QteDet, ISNULL(SUM(VE.MntVenteDet), 0) MntDet,
                ISNULL(SUM(VE.QteVenteCol), 0) QteCol, ISNULL(SUM(VE.MntVenteCol), 0) MntCol,
                ISNULL(SUM(VE.QteVenteTotale), 0) QteTotale, ISNULL(SUM(VE.MntVenteTotal), 0) MntTotal,
                ISNULL(SUM(VE.QteInventaire), 0) QteInv, ISNULL(SUM(VE.QteCommande), 0) QteCom, ISNULL(SUM(VE.QteRetours), 0) QteRet,

                CAST(CASE WHEN SUM(
                        CASE WHEN VE.Erreur = 1 THEN 1 ELSE 0 END
                        ) >= 1 THEN 1 ELSE 0 END AS BIT) Ver,
                NULL AS VerDisplay
        INTO #TEMP
        FROM tblVentes VE
        JOIN tblTitres TI ON VE.TitreID = TI.TitreID
        JOIN tblStatutsVentes SV ON VE.StatutVenteID = SV.StatutVenteID

        LEFT JOIN (
                    SELECT TitreID, COUNT(DISTINCT DetaillantID) AS NbDet
                    FROM tblVentes
                    WHERE DateFinPeriode = @DateFinPeriode
                    AND (ISNULL(@InclureVentesErreurs, 1) = 1 OR Erreur <> 1)
                    GROUP BY TitreID
                    ) CO ON VE.TitreID = CO.TitreID

        LEFT JOIN dbo.fctSplitStringList(@TitreIDs, @Delimiter) TT ON VE.TitreID = TT.NameValue
        WHERE VE.DateFinPeriode = @DateFinPeriode
        AND (@StatutVenteID IS NULL OR VE.StatutVenteID = @StatutVenteID)
        AND (TI.NoNotice IS NULL OR ISNULL(@TitresMomento, 0) = 1)
        AND (TI.DateExclusion IS NULL OR ISNULL(@TitresExclusions, 0) = 1)
        AND (TI.DateInclusion IS NULL OR ISNULL(@TitresInclusions, 0) = 1)
        AND (TI.DateInclusion IS NOT NULL OR TI.DateExclusion IS NOT NULL OR TI.NoNotice IS NOT NULL OR ISNULL(@TitresVentes, 0) = 1)
        AND (@Titre IS NULL OR TI.Titre LIKE @Titre)
        AND (@Ean IS NULL OR (TI.EAN LIKE @Ean) OR (TI.ISBN LIKE @Ean) OR (TI.ISBN13 LIKE @Ean))
        AND (ISNULL(@InclureVentesErreurs, 1) = 1 OR VE.Erreur <> 1)
        GROUP BY TI.TitreID,
                CASE WHEN SV.StatutVenteID IN (4, 2) THEN
                    CASE WHEN TT.NameValue IS NULL THEN 1 ELSE 0 END
                ELSE
                    CASE WHEN TT.NameValue IS NULL THEN 0 ELSE 1 END
                END, SV.StatutVenteID, SV.StatutVente, TI.EAN, TI.Titre, CO.NbDet
        HAVING ISNULL(@TitresAvecErreurs, 0) <> 1 OR SUM(CASE WHEN VE.Erreur = 1 THEN 1 ELSE 0 END) >= 1

        --DECLARE @Count INT
        SET @TotalCount = @@ROWCOUNT
        IF @Mode = 1 -- Search
        BEGIN
            IF ISNULL(@InclureInventaire, 0) = 1 -- includes QteInv, QteCom, QteRet
                SELECT     TA.TitreID, TA.DateFinPeriode, TA.Publier, TA.PublierOrig,
                        TA.StatutVenteID, TA.Statut, TA.EAN, TA.Titre, TA.NbDet,
                        -- Sales fields
                        TA.QteDet, TA.MntDet, TA.QteCol, TA.MntCol, TA.QteTotale, TA.MntTotal,
                        TA.QteInv, TA.QteCom, TA.QteRet,
                        TA.Ver, TA.VerDisplay
                FROM #TEMP TA
                WHERE TA.RowNum BETWEEN(@PageIndex - 1) * @PageSize + 1 AND @PageIndex*@PageSize
                ORDER BY TA.RowNum ASC
            ELSE
                SELECT     TA.TitreID, TA.DateFinPeriode, TA.Publier, TA.PublierOrig,
                        TA.StatutVenteID, TA.Statut, TA.EAN, TA.Titre, TA.NbDet,
                        -- Sales fields
                        TA.QteDet, TA.MntDet, TA.QteCol, TA.MntCol, TA.QteTotale, TA.MntTotal,
                        NULL QteInv, NULL QteCom, NULL QteRet,
                        TA.Ver, TA.VerDisplay
                FROM #TEMP TA
                WHERE TA.RowNum BETWEEN(@PageIndex - 1) * @PageSize + 1 AND @PageIndex*@PageSize
                ORDER BY TA.RowNum ASC
        END
        ELSE -- Export
            IF ISNULL(@InclureInventaire, 0) = 1 -- includes QteInv, QteCom, QteRet
                SELECT     TA.TitreID, TA.DateFinPeriode, TA.Publier, TA.PublierOrig,
                        TA.StatutVenteID, TA.Statut, TA.EAN, TA.Titre, TA.NbDet,
                        -- Sales fields
                        TA.QteDet, TA.MntDet, TA.QteCol, TA.MntCol, TA.QteTotale, TA.MntTotal,
                        TA.QteInv, TA.QteCom, TA.QteRet,
                        TA.Ver, TA.VerDisplay
                FROM #TEMP TA
                ORDER BY TA.RowNum ASC
            ELSE
                SELECT     TA.TitreID, TA.DateFinPeriode, TA.Publier, TA.PublierOrig,
                        TA.StatutVenteID, TA.Statut, TA.EAN, TA.Titre, TA.NbDet,
                        -- Sales fields
                        TA.QteDet, TA.MntDet, TA.QteCol, TA.MntCol, TA.QteTotale, TA.MntTotal,
                        NULL QteInv, NULL QteCom, NULL QteRet,
                        TA.Ver, TA.VerDisplay
                FROM #TEMP TA
                ORDER BY TA.RowNum ASC

        DROP TABLE #TEMP
    Friday, August 29, 2008 8:32 PM