更改 SqlConnection、凭据 属性
Change the SqlConnection,Credentials property
所以我有一个登录页面,我必须执行验证:'If the user is "sa" then it should connect to the Database using that users credentials',这意味着我必须修改我的 SqlConnection
对象的凭据:
if(username.Equals("sa", StringComparison.OrdinalIgnoreCase))
{
var securePassword = new System.Security.SecureString();
foreach(char character in password)
{
securePassword.AppendChar(character);
}
securePassword.MakeReadOnly();
var credentials = new SqlCredential(username, securePassword);
sqlConn.Close();
sqlConn.Credential = credentials;
sqlConn.Open();
return true;
}
但是我在 sqlConn.Credential = credentials;
中遇到异常,即使 属性 不是 readonly
InvalidOperationException: Cannot use Credential with UserID, UID, Password, or PWD connection string keywords.
有没有其他方法可以改变 Credentials
属性?
提前致谢。
如果 SqlConnection
有用户和密码,您似乎可以修改凭据。我使用 this 教程的示例使其工作:
if (username.Equals("sa", StringComparison.OrdinalIgnoreCase))
{
using (SqlConnection conn = new SqlConnection(string.Format("Server={0};Initial Catalog={1};", sqlConn.DataSource, sqlConn.Database)))
{
var securePassword = new System.Security.SecureString();
foreach (char character in password)
{
securePassword.AppendChar(character);
}
securePassword.MakeReadOnly();
var credentials = new SqlCredential(username, securePassword);
conn.Credential = credentials;
conn.Open();
return true;
}
}
因为我无法修改 Credential
属性,所以我复制了 SqlConnection
对象,但没有 username
和 password
connectionString
。这样我以后就可以添加新的 Credential
了。希望这可以帮助其他面临类似问题的人。
SqlConnection.Credential 属性
将引发 InvalidOperationException 异常:
- 如果在打开的连接上设置了凭据。
- 如果在 Context Connection=true 时设置了 Credential。
- 如果在 Integrated Security = true 时设置了 Credential。
- 如果在连接字符串使用密码时设置了凭据。
- 如果在连接字符串使用 UserID 时设置了凭据。
或者您可以使用 SqlConnectionStringBuilder
,
string connectString = "Data source=.;initial catalog=yourDB;
User Id=user; Password=password";
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder (connectString);
SqlConnection sqlConn= new SqlConnection(builder.ConnectionString);
那么在你的方法中,
builder.Remove("User Id");
builder.Remove("Password");
// builder.Remove("integrated security"); if you had used
sqlConn.ConnectionString = builder.ConnectionString;
所以我有一个登录页面,我必须执行验证:'If the user is "sa" then it should connect to the Database using that users credentials',这意味着我必须修改我的 SqlConnection
对象的凭据:
if(username.Equals("sa", StringComparison.OrdinalIgnoreCase))
{
var securePassword = new System.Security.SecureString();
foreach(char character in password)
{
securePassword.AppendChar(character);
}
securePassword.MakeReadOnly();
var credentials = new SqlCredential(username, securePassword);
sqlConn.Close();
sqlConn.Credential = credentials;
sqlConn.Open();
return true;
}
但是我在 sqlConn.Credential = credentials;
中遇到异常,即使 属性 不是 readonly
InvalidOperationException: Cannot use Credential with UserID, UID, Password, or PWD connection string keywords.
有没有其他方法可以改变 Credentials
属性?
提前致谢。
如果 SqlConnection
有用户和密码,您似乎可以修改凭据。我使用 this 教程的示例使其工作:
if (username.Equals("sa", StringComparison.OrdinalIgnoreCase))
{
using (SqlConnection conn = new SqlConnection(string.Format("Server={0};Initial Catalog={1};", sqlConn.DataSource, sqlConn.Database)))
{
var securePassword = new System.Security.SecureString();
foreach (char character in password)
{
securePassword.AppendChar(character);
}
securePassword.MakeReadOnly();
var credentials = new SqlCredential(username, securePassword);
conn.Credential = credentials;
conn.Open();
return true;
}
}
因为我无法修改 Credential
属性,所以我复制了 SqlConnection
对象,但没有 username
和 password
connectionString
。这样我以后就可以添加新的 Credential
了。希望这可以帮助其他面临类似问题的人。
SqlConnection.Credential 属性
将引发 InvalidOperationException 异常:
- 如果在打开的连接上设置了凭据。
- 如果在 Context Connection=true 时设置了 Credential。
- 如果在 Integrated Security = true 时设置了 Credential。
- 如果在连接字符串使用密码时设置了凭据。
- 如果在连接字符串使用 UserID 时设置了凭据。
或者您可以使用 SqlConnectionStringBuilder
,
string connectString = "Data source=.;initial catalog=yourDB;
User Id=user; Password=password";
SqlConnectionStringBuilder builder = new SqlConnectionStringBuilder (connectString);
SqlConnection sqlConn= new SqlConnection(builder.ConnectionString);
那么在你的方法中,
builder.Remove("User Id");
builder.Remove("Password");
// builder.Remove("integrated security"); if you had used
sqlConn.ConnectionString = builder.ConnectionString;