我正在尝试使用以下代码设置在C#中与SQL服务器建立连接的超时时间:
var sscsb = new SqlConnectionStringBuilder(sConn);
sscsb.ConnectTimeout = 10;
SqlConnection connection = new SqlConnection(sscsb.ConnectionString);
using (connection)
{
connection.Open();
connection.Close();
return (true);
}
但在connection.Open()
语句抛出错误之前经过了30秒。如何将连接超时设置为较短的值?
答案 0 :(得分:0)
当我尝试连接到无效的服务器名称时,或者当与有效服务器的网络连接断开时,我遇到了此问题。在这些情况下,超时值被忽略。似乎超时不适用于验证服务器并发送连接请求的尝试。它似乎只适用于找到有效服务器并发出请求后等待连接的时间。
我使用了基于计时器的解决方案,虽然我似乎无法找到它,但这绝对是一种解决方法。 This threading-based solution似乎是要走的路。
答案 1 :(得分:0)
我曾经调查过这个问题并得出了这样的结论: 连接字符串或连接中指定的连接超时意味着:如果sql服务器正在侦听,请等待x秒以使其接受连接请求。如果没有服务器正在侦听端口(例如,sql server未运行),则使用默认套接字连接超时,默认为30秒。 解决方法是使用自定义超时手动打开与sql server的套接字连接,以检查它是否正在运行。
答案 2 :(得分:0)
下面的代码测试连接并能够在连接上运行查询。查询需要引用目标D / B中的小表:
/// <summary>
/// Return true if successful SQL connection
/// </summary>
/// <param name="conn"></param>
/// <param name="timeout">timeout in msec</param>
/// <returns></returns>
public static bool QuickSQLConnectionTest(SqlConnection conn, int timeout)
{
// We'll use a Stopwatch here for simplicity. A comparison to a stored DateTime.Now value could also be used
Stopwatch sw = new Stopwatch();
bool connectSuccess = false;
// Try to open the connection, if anything goes wrong, make sure we set connectSuccess = false
Thread t = new Thread(delegate()
{
try
{
sw.Start();
conn.Open();
SqlCommand cmd = new SqlCommand("Select Count(*) from Configuration", conn);
cmd.CommandTimeout = timeout/1000; // set command timeout to same as stopwatch period
cmd.ExecuteScalar();
connectSuccess = true;
}
catch (Exception Ex)
{
}
});
// Make sure it's marked as a background thread so it'll get cleaned up automatically
t.IsBackground = true;
t.Start();
// Keep trying to join the thread until we either succeed or the timeout value has been exceeded
while (timeout > sw.ElapsedMilliseconds)
if (t.Join(1))
break;
// If we didn't connect successfully
if (!connectSuccess)
{
return false;
}
else
{
return true;
}
}