繁体   English   中英

C#/ SQL Server连接-凭据错误-我可以设置超时吗?

[英]C# / SQL Server Connection - bad credentials - Can I set a timeout?

我正在尝试制作一个工具,该工具将允许用户根据上传的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毫秒,因为如果用户名和密码正确,我几乎会立即收到答案。

谢谢!

根据您的评论,我想说尝试设置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.

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

尝试添加:-

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

但是,这不会解决任何问题。 您已经创建了一个Try / Catch语句来捕获Exception但是您随后通过在MessageBox创建自己的通用消息来忽略Exception消息。

另外,当您使用上述“使用语句”时,不需要调用关闭连接,这是通过using语句自动完成的。

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

先前的一些响应注释使登录超时( SqlConnectionStringBuilder.ConnectTimeout )和命令超时( SqlCommand.CommandTimeout )之间经常混淆。 两者涵盖了不同的范围,并且实际上具有不同的默认值(15秒与30秒)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM