Laden...

[gelöst] SqlCommand.CommandTimeout hat keine Auswirkung

Erstellt von assi vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.815 Views
assi Themenstarter:in
114 Beiträge seit 2006
vor 12 Jahren
[gelöst] SqlCommand.CommandTimeout hat keine Auswirkung

Servus,

ich habe hier einen 2005er MS SQL, eine .Net 2.0 Anwendung und als Connection fahre ich über eine System.Data.SqlClient.SqlConnection,

Connectionstring = "server=" + m_strServer + ";User Id=" + m_strUserID + ";password=" + m_strPassword + ";database=" + m_strDatabase + ";MultipleActiveResultSets=True"

Soweit rollt alles, ich wollte jetzt aber bei einer bestimmten Abfrage den TimeOut hochsetzen, also setze ich nun das CommandTimeout Property wenn übergeben:


(vereinfacht)
 Public Function GetDataTable(ByVal strQuery As String, Optional ByVal intTimeOut As Integer = -1) As DataTable

Dim tblResult As New DataTable()

Dim Command As New SqlCommand(strQuery, Me.m_sql_connection)
             
If intTimeOut > -1 Then Command.CommandTimeout = intTimeOut

Dim data_adapter As New SqlDataAdapter(Command)
data_adapter.Fill(tblResult)

Return tblResult

Wenn wir davon ausgehen das "SELECT furchbargroße Abfrage" 120 Sekunden dauert, sollte also:

GetDataTable("SELECT furchbargroße Abfrage", 10) 

zur Exception führen und

GetDataTable("SELECT furchbargroße Abfrage", 180) 

funktionieren.

Was nicht der Fall ist, beide Abfragen laufen durch und geben Daten zurück, es gibt devinitiv einen Timeout, den manche User hier treffen, ich habe allerdings noch nicht gestoppt wie hoch der eingestellt ist, nichtsdestotrotz müsste, imho, das Property trotzdem festlegen wie lange die App wartet.

Die MSDN http://msdn.microsoft.com/de-de/library/system.data.sqlclient.sqlcommand.commandtimeout%28VS.80%29.aspx weißt darauf hin das

CommandTimeout hat keine Auswirkungen, wenn der Befehl für eine Kontextverbindung ausgeführt wird (eine SqlConnection, die mit "context connection=true" in der Verbindungszeichenfolge geöffnet wurde).

was bei uns nicht der Fall ist, siehe C-String oben.

Hat jemand nen Tipp?

Danke
Assi

And in addition to the darkness there was also me.
And I moved upon the face of the darkness and I saw that I was alone.
Let There Be Light!

K
79 Beiträge seit 2006
vor 12 Jahren

Was für einen wert hat denn

data_adapter.SelectCommand.CommandTimeout

Sollte ja eigentlich dem des Commands entsprechen.

assi Themenstarter:in
114 Beiträge seit 2006
vor 12 Jahren

Jeweils 10 bzw 180

And in addition to the darkness there was also me.
And I moved upon the face of the darkness and I saw that I was alone.
Let There Be Light!

1.378 Beiträge seit 2006
vor 12 Jahren

Ich habe gerade meine Vermutung lokal getestet und bestätigt die wie folgt lautet:

Deine Abfrage dauert keine 10 Sekunden! Jedoch kann das Übertragen evt. länger dauern oder das lokale Verarbeiten(DataTable generieren). Der Timeout bezieht sich offensichtlich nur auf die Zeit, die die Abfrage selbst dauert.

Getestet habe ich eine Abfrage auf eine Tabelle, die ich 2x als Kreuzprodukt ausgelesen hab, welche zig Millionen einträge produziert hat. Das Übertragen hat ewig lange gedauert und trotz 1 Sekunde CommandTimeout keine Exception geworfen. Wenn ich aber in die Abfrage noch eine Where Like '%abc%' oder sowas eingebunden habe hat die Abfrage eindeutig mehr als 1 Sekunde gedauert und somit auch die erwartete Exception verursacht.

Lg, XXX

assi Themenstarter:in
114 Beiträge seit 2006
vor 12 Jahren

Stimmt, guter Ansatz, dh ich knalle mal was dickeres in die Abfrage und lasse den Timeout auf 10 Sek, Kreuztabelle aus zwei Tabellen mit je 203770 Datensätzen.

Timeout! Allerdings erst nach über 60 Sekunden, statt den gewünschten 10..

Ich habe auch nochmal das ganze Projekt nach "Timeout", 60, 60000 etc. durchsucht, in der schwachen Vermutung das mein, begrenzt befähigter, Vorgänger irgendwas haarsträubendes zusammengebastelt hat, bin aber nicht weiter schlauer davon geworden/abe nichts gefunden.

And in addition to the darkness there was also me.
And I moved upon the face of the darkness and I saw that I was alone.
Let There Be Light!

assi Themenstarter:in
114 Beiträge seit 2006
vor 12 Jahren

So, folgende Procedure in der DB abgelegt:


set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

CREATE PROCEDURE [dbo].[provokeTimeout] @sekunden int
AS
BEGIN

	DECLARE @datTimerBis datetime
	SET @datTimerBis = DateAdd(second, @sekunden, GetDate())
	DECLARE @datTimerJetzt datetime
	SET @datTimerJetzt = GetDate()

	WHILE @datTimerJetzt < @datTimerBis
	   BEGIN     
		  SET @datTimerJetzt = GetDate()
	   END

	SELECT 'Done'

END

Die Whileschleife läuft X Sekunden, d.h. 20 Sekunden übergeben, den Timeout auf 10 setzen und wir sollten garantiert noch im Aufruf sein, wenn der Timeout abgelaufen ist.

..oder übersehe ich was?

Edit: "Shave my back and call me an elf!" ..es funktioniert brav wie es soll!

thx @prod

And in addition to the darkness there was also me.
And I moved upon the face of the darkness and I saw that I was alone.
Let There Be Light!