Aggiornamento 2 Suggerisco di eseguire il proprio timeout. Qualcosa di simile a questo:
internal static class Program
{
private static void Main(string[] args)
{
Console.WriteLine(SqlServerIsRunning("Server=foobar; Database=tempdb; Integrated Security=true", 5));
Console.WriteLine(SqlServerIsRunning("Server=localhost; Database=tempdb; Integrated Security=true", 5));
}
private static bool SqlServerIsRunning(string baseConnectionString, int timeoutInSeconds)
{
bool result;
using (SqlConnection sqlConnection = new SqlConnection(baseConnectionString + ";Connection Timeout=" + timeoutInSeconds))
{
Thread thread = new Thread(TryOpen);
ManualResetEvent manualResetEvent = new ManualResetEvent(false);
thread.Start(new Tuple<SqlConnection, ManualResetEvent>(sqlConnection, manualResetEvent));
result = manualResetEvent.WaitOne(timeoutInSeconds*1000);
if (!result)
{
thread.Abort();
}
sqlConnection.Close();
}
return result;
}
private static void TryOpen(object input)
{
Tuple<SqlConnection, ManualResetEvent> parameters = (Tuple<SqlConnection, ManualResetEvent>)input;
try
{
parameters.Item1.Open();
parameters.Item1.Close();
parameters.Item2.Set();
}
catch
{
// Eat any exception, we're not interested in it
}
}
}
Update 1
Ho appena testato questo sul mio computer utilizzando questo codice:
internal static class Program
{
private static void Main(string[] args)
{
SqlConnection con = new SqlConnection("Server=localhost; Database=tempdb; Integrated Security=true;Connection Timeout=5");
Console.WriteLine("Attempting to open connection with {0} second timeout, starting at {1}.", con.ConnectionTimeout, DateTime.Now.ToLongTimeString());
try
{
con.Open();
Console.WriteLine("Successfully opened connection at {0}.", DateTime.Now.ToLongTimeString());
}
catch (SqlException)
{
Console.WriteLine("SqlException raised at {0}.", DateTime.Now.ToLongTimeString());
}
}
}
e obbedisce il valore Connection Timeout
nella stringa di connessione . Questo era con .NET 4 contro SQL Server 2008 R2. Certo, è una connessione localhost che può dare risultati diversi ma significa che non posso replicare il problema.
Posso solo suggerire di provare un pezzo simile di codice nell'ambiente di rete e vedere se continui a vedere lunghi timeout.
Vecchio (errato) risposta ho erroneamente pensato che la proprietà era ConnectionTimeout
impostabile, ma non lo è.
Provare a impostare SqlConnection.ConnectionTimeout anziché utilizzare la stringa di connessione.
fonte
2010-09-01 14:54:07
ConnectionTimeout è una proprietà di sola lettura – BlueMonkMN
sto colpendo un modello molto strano qui. Il timeout sembra funzionare quando mi collego al mio sistema locale con SQL Server interrotto. Sembra funzionare quando provo a connettermi a un server inesistente. Ma non sembra funzionare quando provo a collegarmi a un server esistente, ma ha il firewall che blocca SQL e/o non ha installato SQL Server. – BlueMonkMN
Un thread interessante su questo problema qui: http://www.devnewsgroups.net/group/microsoft.public.dotnet.framework.adonet/topic48533.aspx. Suggerisco di implementare il proprio meccanismo di timeout: spegni un thread per provare a fare l'open e ucciderlo se non ha avuto successo entro il periodo di timeout desiderato. –