Почему при выполнении запроса Entity Framework время ожидания всегда отображается в первый раз? - PullRequest
0 голосов
/ 17 мая 2019

У меня есть приложение, связанное с базой данных через Entity Framework.

add name="dataEntities" 
    connectionString="metadata=res://*/Models.FVData.csdl|res://*/Models.FVData.ssdl|res://*/Models.FVData.msl;provider=System.Data.SqlClient;provider connection string="data source= :) ;initial catalog=FVData;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework"" 
    providerName="System.Data.EntityClient" />

У меня есть класс диспетчера данных, который вызывает хранимую процедуру spFinance.

Моя проблема в том, что каждыйКогда я включаю компьютер и запускаю программу, и программа пытается выполнить хранимую процедуру в первый раз, я получаю исключение тайм-аута.

Но во второй раз, когда я делаю то же самое, требуется всего 10секунд, чтобы получить данные с тем же исполнением.

public class DataLoadManager : IDataLoader
{
    dataEntities fDb = null;
    int count = 0;

    public DataLoadManager()
    {
        fDb = new dataEntities();
        fDb.Database.CommandTimeout = 180;
    }

    public List<spFinance_Result> GetspFinance (DateTime fileDate, int year)
    {
        try
        {
            var paramYear = new SqlParameter("@jahr", year);
            var paramFileDate = new SqlParameter("@fileDate", fileDate);
            var data = fDb.Database.SqlQuery<spFinance_Result>("EXEC spFinance @jahr,@fileDate", paramYear, paramFileDate).ToList();

            if (data != null)
            {
                return data;
            }
            else
            {
                return null;
            }
        }
        catch (Exception e)
        {
            fDb = new dataEntities();
            count++;

            if (count < 3)
                GetspFinance (fileDate, year);
        }

        return null;
    }
}

Я пытался выполнить выше с помощью счетчика и рекурсивного вызова, чтобы он попытался 3 раза получить данные.но это не получает это в первый раз, но ошибка тайм-аута.Но если я закрою программу и запустлю снова, все будет хорошо и быстро.

На внешнем интерфейсе вызов:

await Task.Run(() =>
        {
            try
            {
                FinanceData = financeDataLoader.GetspFinance(fileDate, year);
            }
            catch (Exception ex)
            {

                XtraMessageBox.Show(ex.Message + "/n Please contact with your administrator", "Systom Error!!", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
         }

И хранимая процедура:

CREATE PROCEDURE spFinance
    @jahr AS INT,
    @fileDate AS DATE
AS
BEGIN
    SELECT 
        ROW_NUMBER() OVER (ORDER BY ANSCHLAG) AS [SL],
        M.GroupName,
        CASE 
           WHEN F.SMV = 0 THEN M.Zeilenzuordnung 
           ELSE M.ZeilenzuordnungSMV 
        END AS Zeilenzuordnung,
        F.* 
    FROM
        (SELECT  
             CASE 
                WHEN ADVART = 'SOGL' THEN 'VI' ELSE ANSCHLAG 
             END AS ANSCHLAG,
             AUKURZ,
             INVENTORY,
             ad.INVTRANCHE,
             SUM(ABS(ad.AGNETTO2)) AS 'Total',
             SUM(CASE WHEN MONAT = 'Januar' THEN AGNETTO2 ELSE 0 END) AS 'JANUAR',
             SUM(CASE WHEN MONAT = 'Februar' THEN AGNETTO2 ELSE 0 END) AS 'Februar',
             SUM(CASE WHEN MONAT = 'März' THEN AGNETTO2 ELSE 0 END) AS 'März',
             SUM(CASE WHEN MONAT = 'April' THEN AGNETTO2 ELSE 0 END) AS 'April',
             SUM(CASE WHEN MONAT = 'Mai' THEN AGNETTO2  Else 0   END) AS 'Mai',
             SUM(CASE WHEN MONAT = 'Juni' THEN AGNETTO2  Else 0 END) AS 'Juni',
             SUM(CASE WHEN MONAT = 'Juli' THEN AGNETTO2  Else 0 END) AS 'Juli',
             SUM(CASE WHEN MONAT = 'August' THEN AGNETTO2  Else 0 END) AS 'August',
             SUM(CASE WHEN MONAT = 'September' THEN AGNETTO2  Else 0 END) AS 'September',
             SUM(CASE WHEN MONAT = 'Oktober' THEN AGNETTO2  Else 0 END) AS 'Oktober',
             SUM(CASE WHEN MONAT = 'November' THEN AGNETTO2  Else 0  END) AS 'November',
             SUM(CASE WHEN MONAT = 'Dezember' THEN AGNETTO2  Else 0 END) AS 'Dezember',
             ad.KUKURZ, ad.KUNDENR, 0 AS [SMV], ad.AU 
         FROM 
             [dbo].[anualdata] ad
         WHERE  
             FILEDATE = @fileDate 
             AND JAHR = @jahr 
             AND ANSCHLAG NOT IN ('ON' , 'HD', 'TV', 'RA', 'PN') 
             -- AND KUKURZ = 'BAT'
         GROUP BY 
             ANSCHLAG, AU, AUKURZ, INVENTORY, ad.KUKURZ, ad.KUNDENR, ad.INVTRANCHE, ADVART

         UNION ALL

          SELECT  
              CASE WHEN ADVART = 'SOGL' THEN 'VI' ELSE ANSCHLAG END AS ANSCHLAG,
              AUKURZ, INVENTORY, ad.INVTRANCHE,
              SUM(ABS(ad.SMV)) AS 'Total',
              SUM(ABS(CASE WHEN MONAT = 'Januar' THEN SMV ELSE 0 END)) AS 'JANUAR',
              SUM(ABS(CASE WHEN MONAT = 'Februar' THEN SMV ELSE 0 END )) AS 'Februar',
              SUM(ABS(CASE WHEN MONAT = 'März' THEN SMV ELSE 0 END)) AS 'März',
              SUM(ABS(CASE WHEN MONAT = 'April' THEN SMV ELSE 0 END)) AS 'April',
              SUM(ABS(CASE WHEN MONAT = 'Mai' THEN SMV ELSE 0 END)) AS 'Mai',
              SUM(ABS(CASE WHEN MONAT = 'Juni' THEN SMV ELSE 0 END)) AS 'Juni',
              SUM(ABS(CASE WHEN MONAT = 'Juli' THEN SMV ELSE 0 END)) AS 'Juli',
              SUM(ABS(CASE WHEN MONAT = 'August' THEN SMV ELSE 0 END)) AS 'August',
              SUM(ABS(CASE WHEN MONAT = 'September' THEN SMV ELSE 0 END)) AS 'September',
              SUM(ABS(CASE WHEN MONAT = 'Oktober' THEN SMV ELSE 0 END)) AS 'Oktober',
              SUM(ABS(CASE WHEN MONAT = 'November' THEN SMV ELSE 0 END)) AS 'November',
              SUM(ABS(CASE WHEN MONAT = 'Dezember' THEN SMV ELSE 0 END)) AS 'Dezember',
              ad.KUKURZ, ad.KUNDENR, 1 AS [SMV], ad.AU
          FROM 
              [dbo].[anualdata] ad
          WHERE  
              FILEDATE = @fileDate 
              AND JAHR = @jahr   
              AND ANSCHLAG NOT IN ('ON', 'HD', 'TV', 'RA', 'PN') 
              -- AND KUKURZ = 'BAT'
          GROUP BY 
              ANSCHLAG, AU, AUKURZ, INVENTORY, ad.KUKURZ, ad.KUNDENR, ad.INVTRANCHE, ADVART) AS F
LEFT JOIN 
    (SELECT 
         mt.ShortName, mg.GroupName, mt.Zeilenzuordnung, mt.ZeilenzuordnungSMV 
     FROM 
         [FinanceVolumeData].[dbo].[MediaType] mt
     INNER JOIN 
         [dbo].[MediaGrouppe] mg ON mg.Id = mt.GroupId) AS M ON M.ShortName = F.ANSCHLAG
ORDER BY 
    [SMV], AUKURZ
END
GO

Любое решение будет полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...