Timeout connessione Data Base.

mercoledì 25 novembre 2009 - 15.11

mayck Profilo | Newbie

Ciao a tutti,

sto sviluppando un applicazione in vb.net 2005. L'applicazione si collega ad un db sql sever 2005.
Ho il seguente problema:
1) Scollego il cavo di rete dal computer.
2) Avvio nel software un comando che comporta la connesione al DB.
3) l'oggetto "sqlclient" utilizzato per aprire la connessione impiega più di tre minuti per generare un'eccezzione. Come mai tutto questo tempo? Il timeout di default non dovrebbe essere 15 secondi?

La stessa situazione si verifica se nella stringa di connessione inserisco un server inesistene e lascio il cavo di rete collegato.

Un esempio del codice utilizzato è il seguente:
-----------------------------------------------------------------------------------------------------------
try
conn = New SqlClient.SqlConnection("Data Source=server;Initial Catalog=database;Persist Security Info=True;User ID=sa;Password=sa")
cmd = New SqlClient.SqlCommand
conn.Open()
cmd.Connection = conn

Dim SQLString As String
SQLString = "stringa sql"
cmd.CommandText = SQLString
dim rowsEffected As Integer = cmd.ExecuteNonQuery()

Catch ex As Exception
"gestione errore"
Finally
If Not IsNothing(cmd) Then cmd.Dispose()
If Not IsNothing(conn) Then
If conn.State = ConnectionState.Open Then conn.Close()
conn.Dispose()
End If
End Try
------------------------------------------------------------------------------------------------------------------------

Grazie.

Brainkiller Profilo | Guru

Mmm.....
Prima cosa che proverei a fare è forzare il timeout nella connection string ;Connection Timeout=15
Seconda cosa, ricorda che c'è un Connection Timeout e un Command Timeout. Se non ricordo male la connessione viene effettivamente aperta se c'è un comando lanciato e non vorrei che magari in quel caso parte anche il command timeout e si vada a sommare, che è in ogni caso di 30 secondi se non ricordo male (15 per la connessione come dicevi tu) quindi entrambi comunque minori di 3 minuti.
Prova a forzarli quindi e vediamo.


David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

mayck Profilo | Newbie

Come posso impostare il "Command Timeout"? Il software si blocca e genera una eccezzone sulla riga "conn.open()". Non arriva alla riga in cui viene assegnato l'oggetto di tipo "SqlConnection" all'istanza del "SqlCommand".

lbenaglia Profilo | Guru

>Come posso impostare il "Command Timeout"? Il software si blocca
>e genera una eccezzone sulla riga "conn.open()". Non arriva alla
>riga in cui viene assegnato l'oggetto di tipo "SqlConnection"
>all'istanza del "SqlCommand".

Dato che il problema ce l'hai durante il tentativo di apertura della connessione, dovresti provare ad impostare un valore esplicito per Connection Timeout (non Command Timeout).
Questa operazione puoi farla specificando il valore direttamente nella stringa di connessione oppure valorizzando l'omonima proprietà PRIMA di richiamare il metodo Open:
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx
http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mayck Profilo | Newbie

La propietà "connectionString" è di sola lettura, comunque il valore che imposto tramite la stringa di connessione, per esempio 5 secondi, viene restituita correttamente dalla propietà "connectionString". Anche impostando nella stringa di connessione il timeout a 5 secondi ottengo sempre lo stesso risultato, l'eccezione viene generata dopo 3 minuti circa.

lbenaglia Profilo | Guru

>La propietà "connectionString" è di sola lettura
Dal link indicato:

SqlConnection..::.ConnectionString Property
Gets or sets the string used to open a SQL Server database.

Come fa ad essere in sola lettura?

>Anche impostando nella stringa di connessione il timeout a 5
>secondi ottengo sempre lo stesso risultato, l'eccezione viene
>generata dopo 3 minuti circa.
Non ho altre idee.

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mayck Profilo | Newbie

Scusa ho sbagliato, la propietà in sola lettura è la "connectionTimeout".

lbenaglia Profilo | Guru

>Scusa ho sbagliato, la propietà in sola lettura è la "connectionTimeout".
Si, vero ma:

Remarks
You can set the amount of time a connection waits to time out by using the ConnectTimeout or Connection Timeout keywords in the connection string.

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectiontimeout.aspx

Ciao!
--
Lorenzo Benaglia
Microsoft MVP - SQL Server
http://blogs.dotnethell.it/lorenzo/
http://italy.mvps.org

mayck Profilo | Newbie

Si ho provato ad impostare il timeout nella stringa di connessione: "Data Source=server;Initial Catalog=nomeDB;Persist Security Info=True;User ID=sa;Password=sapwd;Connect Timeout=5".
Il risultato è sempre lo stesso.

Brainkiller Profilo | Guru

>"Data Source=server;Initial Catalog=nomeDB;Persist Security Info=True;User
>ID=sa;Password=sapwd;Connect Timeout=5".
>Il risultato è sempre lo stesso.

Ho notato che hai usato "Connect Timeout" invece di "Connection Timeout" nella connection string.

David De Giacomi | <empty>
http://blogs.dotnethell.it/david/

mayck Profilo | Newbie

Ho provato con entrambe il risultato è lo stesso.

Grazie.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5