2010-12-27 5 views
2

Also, wir haben diesen Code, der aus irgendeinem Grund das Timing aushält. Es ist nicht die gespeicherte Prozedur, die ausgeführt wird, da das ordnungsgemäß ausgeführt wird. Wenn wir den Parameter aus dem C# -Code entfernen, wird der Code ausgeführt. Der Parameter bricht immer wieder ab (was zu einem Timeout führt) und wir können nicht herausfinden warum.Code hält das Timing aus

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; 
     } 

gespeicherte Prozedur:

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 [email protected]) 
     AND (@quoteid is null or [email protected]) 
     AND (@lineitemid is null or LineItemID = @lineitemid) 
END 
+1

Wenn Sie die Parameter zurück und SQL startet Zeitlimit, würde ich sagen, Sie haben ein Problem mit Ihrer Datenbank. Haben Sie die relevanten Spalten indiziert? – Oded

+0

Was passiert, wenn Sie "PTWViewSelect 4711" in SQL Server Management Studio ausführen? –

+0

@jonas wird es gut funktionieren – DForck42

Antwort

0

Einstellung Arithabort aus machte die SP 45 Sekunden im Gegensatz zu 1. Setzen Sie es wieder zurück auf 1 zurück. Ich aktualisierte die gespeicherte Prozedur, um es einzustellen, keine Änderung in der App. Habe es auf "Aus" geändert, keine Änderung. Ich habe dann das Update entfernt und dann hat die App gut funktioniert.

Ich glaube, was passiert ist, dass das Aktualisieren der gespeicherten Prozedur verursachte es neu zu kompilieren, das Problem zu beheben. Ich bin mir aber nicht 100% sicher.

+0

'Ich habe die gespeicherte Prozedur aktualisiert, um sie zu aktivieren 'Dies ist eine Verbindungseinstellung, keine Proc-Einstellung, Sie müssen es in der Verbindung von .NET tun. – SQLMenace

+0

Beispiel ... MyConnection.Execute" SET ARITHABORT ON " – SQLMenace

0

EDIT Wenn Parameter übergeben das Problem ist, dann kommt es darauf an, wie viel Zeit die gespeicherte Prozedur dauert auszuführen. Das Standard-Timeout für SQL Server beträgt normalerweise 120 Sekunden. Sie können "Connect Timeout" hinzufügen, um das Zeitlimit in Ihrer DB-Verbindungszeichenfolge zu erhöhen und auszuchecken.

** Alte Antwort - Ignoriere ** Ohne Stack-Trace, und nehmen Sie Ihr Wort, dass die gespeicherte Prozedur in Ordnung ist, vermute ich, dass es aufgrund der Verbindung fehlschlägt. Der Code ist nicht in der Lage, eine Verbindung zu Ihrem DB-Server herzustellen.

+1

Nicht wenn ohne Parameter es gut funktioniert. – Oded

+0

@Oded - Oops verpasst, dass in Frage - Danke –

2

haben Sie

myCommand.Parameters.AddWithValue("@studynumber", studynumber); 

statt versucht:

es
myCommand.Parameters.AddWithValue("@study", studynumber); 
+0

+1 - Gut entdeckt! – Oded

+0

Hilft bei der Verwendung der korrekten Parameternamen. Es könnte sich aber auch um teilweise gefälschten Code handeln. Aber selbst dann sollte es einen Fehler über den schlechten Parameter werfen und der Fehler wäre kein Timeout-Fehler. –

+0

Sorry, kopierte die gespeicherte Prozedur von dem falschen Server (sprach mit dem Dev und er stellte fest, dass dies nicht das Problem ist) – DForck42

0

Eine Sache könnte sein, die ARITHABORT Einstellung auf EIN gesetzt, um ... NET Standardeinstellung AUS

das proc laufen in SSMS mit ARITHABORT auf OFF setzen und sehen, ob es jetzt langsamer läuft als von .NET

Beispiel

MyConnection.Execute "SET ARITHABORT ON" 

Eine andere Sache ist, dass Ihre WHERE-Klausel nicht optimal ist, werfen Sie einen Blick auf Do you use [email protected] OR @Param IS NULL in your WHERE clause? Don't, it doesn't perform

funktioniert die proc Lauf langsam mit Parametern in SSMS? Können Sie den Ausführungsplan zeigen?

+0

'SET ARITHABORT ON' zu On macht keinen funktionalen Unterschied in SQL Server 2005+ Wenn' ANSI_WARNINGS' on dann sind es wird sich so verhalten, als wäre es sowieso. Der einzige Unterschied, den es macht, wird als Plan-Cache-Schlüssel verwendet. Wenn also ein unterschiedliches Verhalten zwischen Ausführungen bei aktiviertem oder deaktiviertem Verhalten beobachtet wird, handelt es sich wahrscheinlich um ein Parameter-Sniffing-Problem. –