我的Windows窗体项目出了问题。我在SQL Server中有一个用户更改其登录密码的功能。用户将使用旧密码登录Windows窗体。导航到更改密码功能后,将要求他们提供新密码和旧密码。收到新旧密码,使用此SQL命令更改密码
ALTER LOGIN [LOGIN_NAME]
WITH PASSWORD = 'NEW_PASS', OLD_PASSWORD = 'OLD_PASS';
但问题是用户还在此会话中使用旧密码和新密码登录到SQL Server。我停止并再次启动项目后,旧密码已过期。我想当用户提交新密码时,应用程序必须再次强制登录。谁能给我解决方案?
非常感谢!
P / S:我想我应该多谈一下用户连接数据库的方式。
我正在使用这样的连接字符串:
Program.connstr = "Data Source=" + Program.servername + ";Initial Catalog=" + Program.database + ";User ID=" + Program.mlogin + ";password=" + Program.password;
用户使用该数据库中的授权帐户连接到数据库,并执行必要的任务。密码更改将更新连接字符串的密码。
再次感谢!
答案 0 :(得分:0)
假设您为每个SQL数据库请求创建一个新连接(这是您应该如何做的),您可以创建某种SQL连接工厂,它将为您的用户创建连接。当此工厂捕获login failed for user
之类的SQL异常时,请切换到Your password is expired
窗口,然后再次请求凭据。
public class SqlConnectionFactory
{
public static SqlConnection CreateConnection()
{
try
{
string connectionString = $"Data Source={Program.servername};Initial Catalog={Program.database};User ID={Program.mlogin};password={Program.password};";
var connection = new SqlConnection(connectionString);
connection.Open();
return connection;
} catch (SqlException se) when (se.Number == 18456)
{
MessageBox.Show("Your password is invalid. Try to login again.");
Environment.Exit(0);
}
}
}
// Everywhere in your code
SqlConnectionFactory.CreateConnection().
可能你需要一个比关闭应用程序更漂亮的方法,但这只是一个演示
您可能还想为SqlConnectionFactory
创建一些方法,例如ExecuteAndReturnReader
,这将创建连接,创建命令,并在执行后返回其读取器。