63

サーバー上のデータベースから情報を取得するために 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();

しかし、 Openメソッドを呼び出した後、 conn.ConnectionStringがパスワードを失っていることに気付きました。

"Data Source=myServer\SQLEXPRESS;Initial Catalog=DBName;User ID=myUser;"

SqlCommand あとがきで例外が発生
するこれを修正する方法は?
注:奇妙なことは、常に発生するとは限らないことです
編集:コマンド自体とは関係ないと思いますが、とにかく

SqlCommand command = new SqlCommand("select GetDate()", conn);
SqlDataReader reader = command.ExecuteReader();
4

3 に答える 3

90

これは、セキュリティ上の理由から、仕様によるものです。MSDNから:

ConnectionStringは、OLE DB接続文字列に似ていますが、同一ではありません。OLE DBやADOとは異なり、返される接続文字列は、ユーザーが設定したConnectionStringと同じですが、[セキュリティ情報の永続化]の値がfalse(デフォルト)に設定されている場合はセキュリティ情報が差し引かれます。.NET Framework Data Provider for SQL Serverは、[セキュリティ情報の永続化]をtrueに設定しない限り、パスワードを永続化しないか、接続文字列でパスワードを返しません。

于 2012-09-17T22:32:05.703 に答える
61

接続文字列を調べます。パスワードを 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列の先頭に配置したので、スクロールして表示する必要はありません。接続文字列のどこにでも移動できます。通常は表示されます最後に。

他の人が言ったように、これを行う必要がある場合は、意図したとおりに SqlConnection オブジェクトを使用していない可能性があります。

于 2013-01-29T16:42:26.357 に答える
7

独自の検証を追加することもできますが、これは標準の 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 が基になる実装を変更すると、これが壊れる可能性があることに注意してください。これを最善の方法としてアドバイスしているわけではありませんが、方法の 1 つです。

于 2014-02-14T22:32:19.607 に答える