所以,我们已经得到了这组代码,由于某种原因,它们可以保持超时。这不是它正在运行的存储过程,因为它运行正常。另外,如果我们从c#代码中删除参数,代码就会运行。参数不断破坏(导致超时),我们无法弄清楚原因。
C#:
public static PTWViewList GetList(int studynumber)
{
PTWViewList tempList = new PTWViewList();
using (SqlConnection myConnection = new SqlConnection(AppConfiguration.cnARDB))
{
string spName = "ardb.PTWViewSelect";
SqlCommand myCommand = new SqlCommand(spName, myConnection);
myCommand.CommandType = CommandType.StoredProcedure;
myCommand.Parameters.AddWithValue("@study", studynumber);
myConnection.Open();
using (NullableDataReader myReader = new NullableDataReader(myCommand.ExecuteReader())) /*this is where the code times out*/
{
tempList = new PTWViewList();
while (myReader.Read())
{
tempList.Add(FillDataRecord(myReader));
}
myReader.Close();
}
}
tempList.ListCount = tempList.Count;
return tempList;
}
存储过程:
CREATE PROCEDURE [ardb].[PTWViewSelect]
@studynumber int = NULL,
@quoteid uniqueidentifier = NULL,
@lineitemid uniqueidentifier = NULL
AS
BEGIN
SET NOCOUNT ON;
SELECT
[Study]
,[LineItemID]
,[QuoteID]
,[Total]
,[COOP]
,[VendorCost]
,[CustCost]
,[LineItemNumber]
,[StudyTypeCode]
,[GroupLeader]
,[PTWDate]
,[PONumber]
,[POStatus]
,[StudyDirector]
,[SL_DESC_L]
,[SL_Code]
,ProjectDescription
,CreatedBy
,chARProcess
,CODate
FROM
[ARDB].[dbo].[PTWView]
WHERE
(@studynumber is null or StudyNumber=@studynumber)
AND (@quoteid is null or QuoteID=@quoteid)
AND (@lineitemid is null or LineItemID = @lineitemid)
END
答案 0 :(得分:2)
你试过吗
myCommand.Parameters.AddWithValue("@studynumber", studynumber);
而不是:
myCommand.Parameters.AddWithValue("@study", studynumber);
答案 1 :(得分:0)
修改强> 如果传递参数是问题,那么它归结为存储过程执行所花费的时间。 SQL Server的默认超时通常为120秒。您可以添加“连接超时”以增加数据库连接字符串中的超时并签出。
**旧答案 - 忽略** 如果没有堆栈跟踪,并且说出存储过程正常,我猜它是由于连接失败而超时。代码无法连接到您的数据库服务器,因此超时。
答案 2 :(得分:0)
有一件事可能是ARITHABORT
设置,将其设置为ON ... NET默认为OFF
在SSMS中运行proc,将ARITHABORT设置为OFF,看看它是否从.NET运行得更慢
例如
MyConnection.Execute "SET ARITHABORT ON"
另一件事是您的WHERE子句不是最佳的,请查看Do you use Column=@Param OR @Param IS NULL in your WHERE clause? Don't, it doesn't perform
在SSMS中参数的运行速度慢吗?你能展示执行计划吗?
答案 3 :(得分:0)
设置arithabort off使得sp需要45秒而不是1.将其重新设置为将其更改为1.我更新了存储过程以将其设置为开,应用程序中没有更改。将其更改为关闭,无变化。然后我删除了更新,然后应用程序工作正常。
我相信发生的事情是更新存储过程导致它重新编译,修复问题。我对此并不是100%肯定。