ConnectionString теряет пароль после подключения.Открыть
Я использую ADO.NET для получения некоторой информации из базы данных на сервере,
так вот что я делаю:
string conStr = "Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;Password=myPassword";
SqlConnection conn = new SqlConnection(conStr);
conn.Open();
// do stuff
conn.Close();
но после вызова метода Открыть я заметил, что conn.ConnectionString теряет пароль, чтобы он стал:
"Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;"
который вызывает исключение с любыми послесловиями SqlCommand
как это исправить?
Примечание: странно, что этого не происходит всегда
Изменить: я не думаю, что это имеет какое-то отношение к команде, но в любом случае
SqlCommand command = new SqlCommand("select GetDate()", conn);
SqlDataReader reader = command.ExecuteReader();
Ответы
Ответ 1
Это по соображениям безопасности. Из MSDN:
ConnectionString похожа на строку соединения OLE DB, но не идентична. В отличие от OLE DB или ADO, возвращаемая строка соединения такая же, как пользовательская SetString, минус информация о безопасности, если для параметра Persist Security Info установлено значение false (по умолчанию). Поставщик данных .NET Framework для SQL Server не сохраняется и не возвращает пароль в строке подключения, если вы не установите для параметра "Информация о состоянии безопасности" значение "истина".
Ответ 2
Посмотрите строку подключения, чтобы сохранить пароль в свойстве ConnectionString , вы должны добавить "Persist Security Info=true;"
к самой строке подключения.
В следующем примере будет отключен пароль:
string conStr = "Data Source=localhost;Initial Catalog=MyDatabase;User Id=MyUser;Password=MyPassword";
SqlConnection conn = new SqlConnection(conStr);
conn.Open();
conn.Close();
Console.WriteLine(conn.ConnectionString);
Следующий пример сохранит пароль в conn.ConnectionString
:
string conStr = "Persist Security Info=True;Data Source=localhost;Initial Catalog=MyDatabase;User Id=MyUser;Password=MyPassword";
SqlConnection conn = new SqlConnection(conStr);
conn.Open();
conn.Close();
Console.WriteLine(conn.ConnectionString);
Свойство, установленное внутри самой строки соединения не в объекте SqlConnection
, я помещаю его в начало строки подключения, так что вам не нужно прокручивать его, чтобы увидеть его, он может идти в любом месте соединения string, я обычно вижу его в конце.
Как и другие, если вам нужно это сделать, вы, вероятно, не используете объект SqlConnection точно так, как предполагалось.
Ответ 3
Возможно, вы захотите добавить свою собственную проверку, но для получения строки подключения потребуется стандартное SqlConnection (без сохранения безопасности) и доступ к собственному свойству ConnectionOptions.
public static string SqlConnectionToConnectionString(SqlConnection conn)
{
System.Reflection.PropertyInfo property = conn.GetType().GetProperty("ConnectionOptions", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
object optionsObject = property.GetValue(conn, null);
System.Reflection.MethodInfo method = optionsObject.GetType().GetMethod("UsersConnectionString");
string connStr = method.Invoke(optionsObject, new object[] { false }) as string; // argument is "hidePassword" so we set it to false
return connStr;
}
Обратите внимание, что это может нарушиться, если MS изменит базовую реализацию, так как мы используем отражение. Я не рекомендую это как лучший способ сделать это, но это способ.