自动连接SqlConnection

时间:2013-09-12 17:01:27

标签: c# sqlconnection

每次我的SQL Server连接出现问题时(例如某人的服务器切换),我的应用程序都会在消息框中显示异常消息。我不知道连接何时可用,除了我一直试图打开连接/执行查询。

所以我创建了一个等待表单,如果连接不可用就会出现,继续尝试打开连接,并在连接再次可用时自行关闭。

要隐藏用户的冻结,我使用后台工作程序。

这是后台工作人员代码

    private void StartLoader(object sender, DoWorkEventArgs e)
    {
        for (int i = 1; i <= 10; i++)
        {
            if (this.par.sqSuccess) //if no error, means connection is available, stop looping
            {
                break;
            }
            else
            {
                i -= 1;
            }

            System.Threading.Thread.Sleep(5000); //report progress every 5 second
        }

这是后台工作人员的进度改变事件

this.cnn = new SqlConnection(this.par.Constr);

try
{
   this.cnn.Open(); //SqlConnection

   this.par.sqSuccess = true; //if no error, then I change this variable
}
catch (Exception ex)
{
   this.par.Exception = ex.Message;
}
finally
{
   if (this.cnn != null) { this.cnn.Dispose(); }
}
if (this.par.sqSuccess) { this.Close(); }

一切都完成后,我尝试从services.msc停止SQL Server服务,然后尝试连接。

等待表格将出现并继续完成其工作。

尝试连接后几秒钟,我再次启动服务,等待表单关闭,成功。 这是问题,当我再次启动服务之前等待一段时间后,等待表单仍然关闭,但需要一段时间。

检查完所有内容后,似乎cnn.open()排队,停止服务的时间越长,等待表单关闭所需的时间越长。

我搜索了谷歌并尝试添加Connect Timeout = 3;在我的连接字符串后面,因为我确定我的thread.sleep(5000)不会让它们排队,但仍然无法正常工作。

有人告诉我使用cnn.OpenAsync();

阅读有关OpenAsync的文档后,这就是我的工作。

    static async Task<ConnectionState> Method(SqlConnection cnn)
    {
        await cnn.OpenAsync();
        return cnn.State;
    }

这个

    private void SQLClientLoader_Load(object sender, EventArgs e)
    {
        do
        {
            this.cnn = new SqlConnection(this.par.Constr);

            try
            {
                ConnectionState cst = Method(cnn).Result;

                if (cst == ConnectionState.Open)
                {
                    this.par.sqSuccess = true;
                }
                else
                {

                }
            }
            catch (Exception ex)
            {
                this.par.sqSuccess = false;

                this.par.Exception = ex.Message;
            }
            finally
            {

            }
        } while ((bool)this.par.sqSuccess != true);
    }

每次执行表单加载代码时,上面的代码都会冻结我的应用程序。

我需要简单说明如何等待cnn.Open进程完成,或者如果花费的时间太长就取消它。

提前谢谢

1 个答案:

答案 0 :(得分:0)

您可以在代码或ConnectionString中为SqlConnection设置ConnectionTimeout属性。无需使用Async恕我直言..

cnn.ConnectionTimeout = 5000

如果连接不起作用,这将产生大约10秒的延迟(connectiontimeout + Sleep(5000)。

相关问题