2009-05-07 7 views
1

J'utilise asp.net, .NET 3.5, C# et SQL Server Express 2005.Asp.Net donne une erreur de délai d'attente lors de l'exécution d'une procédure stockée

J'ai créé une procédure stockée dans SQL, et quand je exécuter SP à partir du serveur SQL il faut moins d'1 seconde pour retourner les résultats. J'ai également essayé cette requête dans l'analyseur de requête et cela me donne aussi des résultats en moins d'une seconde. Mais quand j'essaye d'appeler ce SP à partir de .NET (C#), cela prend beaucoup de temps, et ensuite donne une erreur de timeout.

Voici le code que je utilise pour appeler la procédure stockée:

SqlConnection con = new SqlConnection(); 

con.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString; 
con.Open(); 

SqlCommand command = new SqlCommand("spReport_SiteUsage_KP", con); 

command.CommandType = CommandType.StoredProcedure; 

command.Parameters.Add(new SqlParameter("@fromDate", SqlDbType.DateTime)); 

command.Parameters.Add(new SqlParameter("@toDate", SqlDbType.DateTime)); 

command.Parameters[0].Value = Convert.ToDateTime(DatePicker1.SelectedDate.ToShortDateString()); 

command.Parameters[1].Value = DatePicker2.SelectedDate; 

int i = command.ExecuteNonQuery(); 

con.Close(); 

Procédure magasin:

set ANSI_NULLS ON 
set QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[spReport_SiteUsage_KP] 
    @fromDate datetime = null, 
    @toDate datetime = null 
AS 
    truncate table dbo.RPT_SiteUsage 

IF (@FromDate is not null and @ToDate is not null) --Hourly Report, grouped by hour 
Begin 

    insert into RPT_SiteUsage 
    select '' as ReportType, 
    'Site Usage for '+ datename(mm,@fromDate)+' '+datename(dd,@fromDate)+', '+datename(yy,@fromDate) + 
    ' To '+datename(mm,@toDate)+' '+datename(dd,@toDate)+', '+datename(yy,@toDate) as ReportTitle, 
    min(@fromDate) as FromDate,max(@toDate) as ToDate, 
    isnull(count(s.SessionId),0) VisitsTotal, 
    isnull(count(distinct(s.cookieid)),0) VisitsUnique, 
    isnull(sum(PagesVisited),0) PageViews, 
    isnull(round(avg(convert(decimal(10,2),PagesVisited)),2),0) PagePerVisit, 
    isnull(min(PagesVisited),0) MinNoPageViews, 
    isnull(max(PagesVisited),0) MaxNoPageViews, 
    isnull(round(avg(convert(decimal(10,2),TimeInSiteMinutes)),2),0) AvgTimeInSite, 
    isnull(min(TimeInSiteMinutes),0) MinTimeSpent, 
    isnull(max(TimeInSiteMinutes),0) MaxTimeSpent, 
    isnull(sum(NewPeople),0) as NewVisitors 
    from 
    dbo.UMM_UserAction ua inner join dbo.UMM_Session s on ua.SessionId=s.Sessionid 
    left join 
     (select ua.sessionId, datediff(ss,min(Actiondate),max(Actiondate))/60 TimeInSiteMinutes 
     from dbo.UMM_UserAction ua 
     where ActionDate between @fromDate and @toDate 
     group by ua.sessionid 
     ) sessionTime on ua.sessionId = sessionTime.sessionid 
    left join 
     (select ua.sessionId, 0 as NewPeople 
     from dbo.UMM_UserAction ua 
      inner join dbo.UMM_Session s on ua.SessionId=s.SessionId 
      inner join dbo.UMM_Cookie c on s.CookieId=c.CookieId 
      where ua.actiondate< @fromDate --this is the from date 
     group by UserId,ua.sessionId  
     ) Old on ua.sessionId = Old.sessionid 
    left join 
     (select ua.sessionId,count(distinct(uaP.PageEntryId)) as PagesVisited 
     from dbo.UMM_UserAction ua, 
     dbo.UMM_UserActionPageReview uaP 
     where ua.UserActionId=uaP.UserActionId 
     and ActionDate between @fromDate and @toDate 
     group by ua.sessionId 
     )pVisited on ua.sessionId = pVisited.sessionId 
    where ActionDate between @fromDate and @toDate 

    IF (select count(*) from RPT_SiteUsage)=0 
     insert into RPT_SiteUsage 
     select '(1 day)' as ReportType, 
     'Site Usage for '+datename(mm,@fromDate)+' '+datename(dd,@fromDate)+', '+datename(yy,@fromDate) + 
     ' To '+datename(mm,@toDate)+' '+datename(dd,@toDate)+', '+datename(yy,@toDate) as ReportTitle, 
     min(@fromDate) as FromDate,max(@toDate) as ToDate, 
     0 as VisitsTotal, 
     0 as VisitsUnique, 
     0 as PageViews, 
     0 as PagePerVisit, 
     0 as MinNoPageViews, 
     0 as MaxNoPageViews, 
     0 as AvgTimeInSite, 
     0 as MinTimeSpent, 
     0 as MaxTimeSpent, 
     0 as NewVisitors 

END 
+0

de publier votre proc stocké ainsi. –

+0

Timeout sur quelle ligne? con.Open (probablement) ou command.Execute? –

+0

La temporisation est comminig sur int i = command.ExecuteNonQuery(); – Kartik

Répondre

1

bien - Je dirais qu'il ya une erreur dans la chaîne de connexion. S'il te plaît vérifie le.

+0

mais quand je passe une petite plage de dates ça marche bien mais quand je passe plus de 3 mois alors ça donne une erreur de timeout ... j'essaye aussi en sql avec la même large gamme (aprox un an) et ça sort moins d'une seconde. .. – Kartik

0

S'il faut longtemps avant que la requête renvoie une erreur, il y a probablement un problème avec votre connexion (chaîne).

+0

ça marche bien si je passe de petites données de plage de dates – Kartik

+0

Ah, plus d'infos. Pouvez-vous publier les détails d'exception? – GvS

0

Cela pourrait être le problème amusant avec un mauvais plan de requête mis en cache sur le proc. Surtout si les tripes de la proc juste comme une requête dans Query Analyzer fonctionne bien. Vérifiez ce lien pour savoir comment résoudre la situation: http://www.mssqltips.com/tip.asp?tip=1304

+0

Ne pas avoir de chance .. avez-vous plus d'idiea ?? – Kartik

2

Une autre idée, TimeOut de chaque SqlCommand est également contrôlée individuellement, vous pouvez donc la contrôler avec la propriété CommandTimeOut.

command.CommandTimeout = 120; 

Cependant, je voudrais vérifier le plan d'exécution pour voir où est-il perdre ou monopoliser les ressources db, je suggère ce juste pour l'expérience, et non sur la production.

+0

J'ai essayé de faire comme ça c'est arrivé après 2 minutes mais ça fait trop de temps en sql ça répond en une seconde – Kartik

Questions connexes