Asp.Net 在运行存储过程时出现超时错误
Posted
技术标签:
【中文标题】Asp.Net 在运行存储过程时出现超时错误【英文标题】:Asp.Net Gives a Timeout Error While Running a Stored Procedure 【发布时间】:2009-05-07 16:09:00 【问题描述】:我正在使用 asp.net、.NET 3.5、C# 和 SQL Server Express 2005。
我在 SQL 中创建了一个存储过程,当我从 SQL 服务器运行 SP 时,返回结果的时间不到 1 秒。我还在查询分析器中尝试过该查询,它也在不到 1 秒的时间内给了我结果。但是当我尝试从 .NET (C#) 调用这个 SP 时,需要很长时间,然后给出超时错误。
这是我用来调用存储过程的代码:
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();
存储过程:
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
【问题讨论】:
也发布您的存储过程。 在哪一行超时? con.Open(可能)或command.Execute? 超时在 int i = command.ExecuteNonQuery(); 【参考方案1】:另外一个思路,每个SqlCommand的TimeOut也是单独控制的,所以可以通过CommandTimeOut属性来控制。
command.CommandTimeout = 120;
但是,我会检查执行计划,看看它在哪里浪费或占用数据库资源,我建议这只是为了实验,而不是在生产环境中。
【讨论】:
我试图这样做,它是在 2 分钟后出现的,但它在 sql 中的时间太长,它在一秒钟内回复【参考方案2】:嗯 - 我会说你的连接字符串有错误。请检查一下。
【讨论】:
但是当我通过小日期范围时它工作正常但是当我通过超过 3 个月时它会给出超时错误.. 我也尝试在具有相同大范围的 sql 中(大约一年)并且它是出来不到一秒...【参考方案3】:如果查询返回错误需要很长时间,则您的连接(字符串)可能有问题。
【讨论】:
啊,更多信息。可以公布异常详情吗?【参考方案4】:这可能是一个有趣的问题,即缓存在 proc 上的查询计划不正确。特别是如果 proc 的胆量就像 Query Analyzer 中的 Query 运行良好。查看此链接了解如何解决此问题:http://www.mssqltips.com/tip.asp?tip=1304
【讨论】:
运气不好..你还有什么想法吗??以上是关于Asp.Net 在运行存储过程时出现超时错误的主要内容,如果未能解决你的问题,请参考以下文章
在 ASP.NET MVC 中执行 SQL Server 存储过程时如何防止超时错误?
[ASP.NET Core Web应用上使用个人用户帐户存储在应用程序中的Postman模拟登录时出现400错误请求错误