代码保持时间安排

时间:2010-12-27 15:35:53

标签: c# sql-server-2008 asp.net-4.0

所以,我们已经得到了这组代码,由于某种原因,它们可以保持超时。这不是它正在运行的存储过程,因为它运行正常。另外,如果我们从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

4 个答案:

答案 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%肯定。