0

我正在尝试制作一个工具,允许用户根据上传的 XML 文件更新不同数据库中的某些表。我需要让用户选择 SQL Server 实例,编写登录凭据,然后,如果凭据正确,他将不得不选择要更新的数据库。

我的问题是,当提供的用户名和密码错误时,用户必须等待 2-3 秒才能得到我捕捉到的异常,告诉他他输入错误。

我的代码现在看起来像这样:

private void comboDatabaseTarget_DropDown(object sender, System.EventArgs e)
        {
            String connString = "Server=" + this.comboSQLServerInstances.Text + ";User Id=sa;Password=testPasswd;";
            try
            {
                using (SqlConnection sqlConn = new SqlConnection(connString))
                {
                    sqlConn.Open();
                    DataTable tblDatabases = sqlConn.GetSchema("Databases");
                    sqlConn.Close();
                    foreach (System.Data.DataRow row in tblDatabases.Select())
                    {
                        this.comboDatabaseTarget.Items.Add(row.ItemArray[0]);
                    }
                }
            }
            catch (Exception ex)
            {

                MessageBox.Show("wrong username and password, or bad sql instance");
            }
        }

我的问题是:当我尝试连接到数据库时,有什么方法可以设置超时?假设是 100 毫秒,因为如果用户名和密码正确,我几乎会立即收到答案。

谢谢!

4

3 回答 3

3

根据您的评论,我会说尝试设置SqlConnection.ConnectionTimeout。默认值为 15 秒。

编辑:

该属性实际上是只读的。但是,备注部分指出:

You can set the amount of time a connection waits to time out by using the 
ConnectTimeout or Connection Timeout keywords in the connection string. A value 
of 0 indicates no limit, and should be avoided in a ConnectionString because an 
attempt to connect waits indefinitely.
于 2013-01-16T11:48:41.230 回答
2

您可以通过将时间添加到连接字符串来设置连接超时。

尝试添加:-

"Connection Timeout=2;"到连接字符串的末尾。

然而,这并不能解决任何问题。您已经创建了一个 Try/Catch 语句,它Exception通过在MessageBox.

此外,当您使用上述“Using 语句”时,您无需调用关闭连接,这是由 using 语句自动完成的。

于 2013-01-16T11:58:00.073 回答
1

可以从连接字符串本身设置登录超时,请参阅SqlConnectionStringBuilder.ConnectTimeout。默认值为 15 秒。但是,将此超时设置得更低(ns)将是一个非常非常非常糟糕的主意。您收到拒绝访问异常的事实意味着登录成功,并且由于凭据错误而被拒绝。这意味着建立凭据需要 2-3 秒。因此,将登录超时设置得较低只会关闭所有连接,因为它们只会在登录之前超时!. 冷登录(第一次尝试)时 2-3 秒是正常的,因为它们通常意味着缓存未命中所有内容:DNS 名称、Kerberos 票证、目标 LSA、SQL 身份验证令牌。要保持应用程序响应,请确保您在 2-3 秒内不劫持消息泵(即测试来自后台线程的连接)。

之前的一些回复评论使登录超时 ( SqlConnectionStringBuilder.ConnectTimeout) 和命令超时 ( SqlCommand.CommandTimeout) 之间产生了通常的混淆。两者涵盖不同的范围,并且确实具有不同的默认值(15s vs 30s)。

于 2013-01-16T12:34:55.867 回答