Подтвердить что ты не робот

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();
4b9b3361

Ответ 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 изменит базовую реализацию, так как мы используем отражение. Я не рекомендую это как лучший способ сделать это, но это способ.