【问题标题】:Auto Connect SqlConnection自动连接 SqlConnection
【发布时间】:2013-09-12 17:01:26
【问题描述】:

每次我的 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
        }

这是后台worker的进度改变事件

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 进程完成或在时间过长时取消它。

提前谢谢你

【问题讨论】:

  • 设置连接超时属性怎么样?
  • 我确实设置了连接超时,但仍然不明白为什么 cnn.Open 排队。

标签: c# sqlconnection


【解决方案1】:

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

cnn.ConnectionTimeout = 5000

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

【讨论】:

  • 感谢您的回答,我的连接字符串中确实有 Connect Timeout,并且超时时间低于我的 thread.sleep。仍然是 cnn.Open 队列。还有其他解决方案吗?
猜你喜欢
  • 2021-10-16
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
相关资源
最近更新 更多