在打开连接前检查SQL Server的登录是否有效

本文关键字:Server 登录 是否 有效 SQL 检查 连接 | 更新日期: 2023-09-27 18:09:00

我正在编写一个c#应用程序,它连接到Microsoft SQL Server,由用户选择,使用集成安全或用户提供的用户名和密码连接到数据库。

当前,如果用户输入错误的密码或使用没有权限访问服务器的windows帐户,则在打开SqlConnection时抛出SqlException

我希望为用户提供不同的反馈,这取决于SqlException是否由于登录失败而被抛出,或者由于另一个错误而被抛出,例如服务器名称不正确。目前,找出为什么抛出SqlException的唯一方法是查看消息字符串,这不是一个很好的解决方案。在打开SqlConnection之前,是否有一种方法可以确定用户名和密码是否正确,或者找出SqlException被抛出的原因?

目前我的连接字符串是Data Source=ServerName'SQLExpress;User=userName;Password=userPassword;Data Source=ServerName'SQLExpress;Integrated Security=true;取决于用户的选择。

打开连接的代码是:

const string ConnectionStringTemplate = "Data Source={0}''SQLExpress;"; //Basic part of the connection string
const string UserLogInTemplate = "User={0};Password={1}";  //Template for adding user authentication
const string NoAuthString = "Integrated Security=true;"; //If no username/password provided use this
string connectionString;
connectionString = String.Format(ConnectionStringTemplate, serverName);
if (usesAuthentication)
{
    connectionString += String.Format(UserLogInTemplate, userName, password);
}
else
{
    connectionString += NoAuthString;
}
sqlcnn = new SqlConnection(connectionString);
sqlcnn.Open(); //SQLException occurs here if Password incorrect or server name wrong etc.

在打开连接前检查SQL Server的登录是否有效

不要让异常发生。

在尝试对用户执行任何操作之前验证该用户。验证服务器,验证所有想要验证的东西。这种方法的问题是,您永远无法摆脱验证陷阱,总有一些地方可能出错。我建议你分析哪些问题是可能的,并试图防止那些,把剩下的留给一个通用的SqlException处理程序。

如果你这样做,仍然有一个小的机会,你的异常会发生由于并发性,但这将是非常罕见的,所以在大多数情况下,你不需要担心。

关于服务器名称不正确,这种情况极不可能发生。换句话说,如果您的应用程序每天出现问题,只有0.001%的情况是服务器名出了问题。

对于更具体的解决方案,请展示一些您的代码。

使用SQLExcpetion。

抛出的SQLException包含Number属性。

如果登录失败,则Number为18456,如果无法找到服务器,则Number为-1。其他错误编号与SQL-Server给出的相同,可以在https://technet.microsoft.com/en-us/library/cc645603(v=sql.105).aspx

中找到。

(感谢Matt)