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!
Was für einen wert hat denn
data_adapter.SelectCommand.CommandTimeout
Sollte ja eigentlich dem des Commands entsprechen.
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!
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
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!
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!