我有一个软件,该软件可以显示SQL数据库中的某些表。现在,我想添加一个工具,可以在其中更改“ testdummy”用户的密码。
我尝试再次打开连接,但没有帮助。如果您需要一些其他代码或信息,只需写评论。
请注意,我是编程新手。我是一个学徒,目前正在学习编程和管理数据库。我知道这不是最安全的解决方案,但这只是我老师的一项小任务。该软件将不会为客户发布。
就像我之前提到的那样,在尝试更改密码之前,我尝试再次打开连接。
public void Change()
{
SqlConnection con = new SqlConnection();
string connectionString = GetConnectionString();
if (NewPassword.Password == NewPasswordAgain.Password && OldPassword.Password == GlobalData.Password)
{
try
{
//dbMan.TryConnect(connectionString);
//con.Open();
SqlConnection.ChangePassword($"Data Source={GlobalData.ServerName};Initial Catalog={GlobalData.DBName};UID={GlobalData.Username};PWD={OldPassword}", $"{NewPassword}");
}
catch (SqlException ex)
{
MessageBox.Show("Unable to change password. Try again!" + ex);
}
}
else
{
// If new Password doesn't match.
MessageBox.Show("Passwords doesn't match!");
}
}
尝试更改密码时,我遇到SQL异常。
(System.Data.SqlClient.SqlException (0x80131904): Login failed for user 'csharptest'.
我在:
SqlConnection.ChangePassword($"Data Source={GlobalData.ServerName};Initial Catalog={GlobalData.DBName};UID={GlobalData.Username};PWD={OldPassword}", $"{NewPassword}");
在编程的这一点上,应该有一个到数据库的连接,因为我可以处理一些表并处理数据集。
但是当我取消评论时:
//dbMan.TryConnect(connectionString);
//con.Open();
它进入那里的固定支架:
public bool TryConnect(string connectionString)
{
conn = new SqlConnection();
conn.ConnectionString = connectionString;
try
{
conn.Open();
return true;
}
catch (Exception)
{
MessageBox.Show("Couldn't connect");
return false;
}
}
并返回以下异常:
System.InvalidOperationException: 'Die ConnectionString-Eigenschaft wurde nicht initialisiert.'
用英语应该是这样的:“ connectionstring属性尚未初始化”
编辑: 在日志中,我得到这个:
Login failed for user 'csharptest'. Reason: Password did not match that for the login provided.
编辑: 代替:
SqlConnection.ChangePassword($"Data Source={GlobalData.ServerName};Initial Catalog={GlobalData.DBName};UID={GlobalData.Username};PWD={OldPassword}", $"{NewPassword}");
我这样做了:
string updatePassword = "USE CSHARPTEST ALTER LOGIN [" + GlobalData.Username + "] WITH PASSWORD = '" + NewPassword + "'";
con.Open();
cmd.ExecuteNonQuery();
现在我认为唯一的问题是服务器上的权限。
答案 0 :(得分:0)
您需要在DbContext级别使用参数。有关更多详细信息,请参见此答案,但这是一个代码示例(改编自同一页面):
string sql = "ALTER LOGIN @loginName WITH PASSWORD = @password";
ctx.Database.ExecuteSqlCommand(
sql,
new SqlParameter("loginName", loginName),
new SqlParameter("password", password));
在此处(以及所有地方)使用参数的目的是为了防止SQL注入攻击。考虑到您正在编写更改密码的代码,这一点尤其重要。
更新
ALTER LOGIN语句不适用于变量;它必须通过动态SQL完成。这是更新代码的示例:
string sql = @"DECLARE @sql NVARCHAR(500)
SET @sql = 'ALTER LOGIN ' + QuoteName(@loginName) +
' WITH PASSWORD= ' + QuoteName(@password, '''')
EXEC @sql ";
ctx.Database.ExecuteSqlCommand(
sql,
new SqlParameter("loginName", loginName),
new SqlParameter("password", password));
请注意,我们仍在使用SqlParameters来防止SQL注入攻击。我们还使用T-SQL方法QuoteName在生成的SQL中进行正确的引用。但是此方法只是将任何[字符(在第一个调用中)或'字符(在第二个调用中)加倍。还有很多其他用于SQL注入攻击的媒介,因此仅依靠QuoteName是不够的。