用C#测试SQL Server是否“正在运行”,可直接使用SqlConnection的Open方法,没有捕获异常时认为SQL Server“正在运行”,否则为连接失败。
测试的时候,SQL Server 2000 SP4和测试程序运行与同一台计算机。我在一个窗体里面加入了一个按钮,按下按钮则开始测试。
当SQL Server处在运行状态时,程序弹出“连接成功”提示框,此时不退出测试程序,停止SQL Server,重新测试连接,仍得到“连接成功”提示。如果此时退出测试程序,重新打开测试,则显示“连接失败”。
请问测试程序没有退出的时候,是否有缓存保留了SQL连接信息?
应该如何处理,才能每次都得到正确的测试结果? // 测试SQL连接
void BtnTestClick(object sender, EventArgs e)
{
string _connString = "Data Source=" +  tbSqlIP.Text + 
";Initial Catalog=" + tbSqlDatabase.Text + 
";User ID=" + tbUser.Text + 
";pwd=" + tbPwd.Text + ";";

using(SqlConnection sqlConn = new SqlConnection(_connString))
{
try
{
sqlConn.Open();
MessageBox.Show("Sql连接成功!","恭喜",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
}
catch(Exception)
{
MessageBox.Show("Sql连接失败,请检查设置参数与网络连接!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
}
finally
{
sqlConn.Close();
sqlConn.Dispose();
}
}
}

解决方案 »

  1.   

    不应该啊,你确定每次 tbSqlIP.Text 都一样?
      

  2.   

    这方法也太不靠谱了,很多情况都会导致连接失败,你还不如检测进程是否存在呢,Process类
      

  3.   

    我的tbSqlIP数据时用app.config获取的,设定为127.0.0.1,这些参数每次都是一样的。
    问题不在这里。
      

  4.   

    我现在做测试是在同一台计算机上,实际应用的时候是SQL服务器是在局域网中另外一台计算机的。请问还有没有其他的方法?
      

  5.   

    刚刚试过,测试程序与SQL Server运行于不同的计算机时,仍然存在相同的问题。
      

  6.   

    你停止的是SQL Server服务还是只是仅仅关闭SQL Server运行环境
      

  7.   

    首先你这段代码写得有点问题,自己写try..catch..就不要用using了。
    然后你这个问题可能和Open方法的实现有点关系,我没有看到源码,我猜可能是首先判断OpenSate,打开连接之后,状态就存保存在OpenState里,当你dispose了con之后,这个对象就返回给连接池,在你关闭了数据库之后,这个连接仍然没有真正关闭,当你再次调用时,连接池返回这个对象给你,Open方法执行成功,你可以禁用连接池再测试一下。
      

  8.   

    通过SQL Server服务管理器停止SQL Server服务
      

  9.   

    问题确实出现在连接池这里,将finally块改为下面语句即可。
    SqlConnection.ClearPool(sqlConn);完整的代码:
    // 测试SQL连接
    void BtnTestClick(object sender, EventArgs e)
    {
    string _connString = "Data Source=" +  tbSqlIP.Text + 
    ";Initial Catalog=" + tbSqlDatabase.Text + 
    ";User ID=" + tbUser.Text + 
    ";pwd=" + tbPwd.Text + ";";

    using(SqlConnection sqlConn = new SqlConnection(_connString))
    {
    try
    {
    sqlConn.Open();
    MessageBox.Show("Sql连接成功!","恭喜",MessageBoxButtons.OK,MessageBoxIcon.Exclamation);
    }
    catch(Exception)
    {
    MessageBox.Show("Sql连接失败,请检查设置参数与网络连接!","警告",MessageBoxButtons.OK,MessageBoxIcon.Warning);
    }
    finally
    {
    SqlConnection.ClearPool(sqlConn);
    }
    }
    }