2009-05-07 4 views
1

ich asp.net verwende, .NET 3.5, C# und SQL Server Express 2005.Asp.Net Gibt ein Timeout Fehler bei Ausführung einer gespeicherten Prozedur

ich eine gespeicherte Prozedur in SQL erstellt haben, und wenn ich Run SP von SQL Server dauert es weniger als 1 Sekunde, um Ergebnisse zurückzugeben. Ich habe auch diese Abfrage im Abfrageanalysator versucht, und es gibt mir auch Ergebnisse in weniger als 1 Sekunde. Aber wenn ich versuche, diesen SP von .NET (C#) aufzurufen, dauert es lange und gibt dann einen Zeitüberschreitungsfehler.

Hier ist der Code, den ich die gespeicherte Prozedur aufzurufen bin mit:

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(); 

Shop Vorgehen:

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

posten Sie auch Ihre gespeicherten Proc. –

+0

Timeout auf welcher Leitung? con.Open (wahrscheinlich) oder command.Execute? –

+0

Timeout ist comminig auf int i = command.ExecuteNonQuery(); – Kartik

Antwort

1

Nun - ich würde sagen, dass es in Ihrer Verbindungszeichenfolge ein Fehler ist. Überprüfen Sie bitte das.

+0

aber wenn ich kleinen Datumsbereich passiere, funktioniert es gut, aber wenn ich mehr als 3 Monate dann passiere, gibt es eine Auszeit Fehler .. Ich versuche auch in Sql mit der gleichen großen Reichweite (ca. ein Jahr) und es kommt weniger als eine Sekunde heraus. .. – Kartik

0

Wenn es lange dauert, bevor die Abfrage einen Fehler zurückgibt, ist wahrscheinlich etwas falsch mit Ihrer Verbindung (Zeichenfolge).

+0

es funktioniert gut, wenn ich kleine Datumsbereichsdaten gebe – Kartik

+0

Ah, mehr Info. Können Sie die Ausnahmedetails veröffentlichen? – GvS

0

Es könnte das Spaßproblem mit einem falschen Abfrageplan sein, der auf dem Proc zwischengespeichert wird. Vor allem, wenn die Eingeweide des Proc nur als Query in Query Analyzer gut läuft. Überprüfen Sie diesen Link auf, wie die Situation zu beheben: http://www.mssqltips.com/tip.asp?tip=1304

+0

Kein Glück mehr .. hast du noch mehr idiea ?? – Kartik

2

Eine andere Idee, die TimeOut jedes SqlCommand wird auch einzeln gesteuert, so können Sie es mit CommandTimeOut-Eigenschaft steuern.

command.CommandTimeout = 120; 

Allerdings würde ich den Ausführungsplan überprüfen, um zu sehen, wo ist es zu verschwenden oder db Ressourcen hogging, schlage ich dies nur für das Experiment, nicht auf die Produktion.

+0

Ich habe versucht, so zu tun, es ist nach 2 mints gekommen, aber es ist zu viel Zeit in sql es ist in einer Sekunde mit antworten – Kartik

Verwandte Themen