[英]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.