2012-09-17 92 views
26

我使用ADO.NET來從數據庫的服務器上的一些信息後會失去密碼,
所以這是我做的:的ConnectionString connection.Open

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(); 
+0

對於初學者來說,執行conn.Open()後你有實際的代碼否則你打開它,然後根據你在上面的例子中關閉它。 – MethodMan

+0

conStr不能被SqlConnection在代碼中修改已發佈。你想看看康恩。ConnectionString(或一些類似的屬性?)。 –

+0

@insta:臨屋的什麼OP說:_「我注意到,conn.ConnectionString失去密碼」 _ –

回答

42

這是由設計,出於安全原因。 From MSDN

ConnectionString類似於OLE DB連接字符串,但不相同。與OLE DB或ADO不同,返回的連接字符串與用戶設置的ConnectionString相同,如果Persist Security Info值設置爲false(默認),則會減去安全性信息。 除非將持久安全信息設置爲true,否則SQL Server的.NET Framework數據提供程序不會保留或返回連接字符串中的密碼。

+0

偉大的,我讀了某個地方不知道如何使用它,你能告訴我如何使用它嗎?因爲我沒有看到**堅持安全信息**任何地方感謝 – Star

+4

@Star,我給你的鏈接中有一個例子。只需在連接字符串中包含「Persist Security Info = True」即可。但無論如何,你不應該這樣做......如果你需要ConnectionString屬性來保存密碼,你可能沒有正確使用它。 –

+0

我明白了,所以你有什麼想法,我可以錯過?並再次真的很感謝你:) – Star

30

看在連接字符串中,爲了保持密碼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對象。

4

您可能想要添加自己的驗證,但這將採用標準的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更改底層實現,這可能會中斷,因爲我們正在使用反射。我並不建議這是做這件事的最好方法,但這是一種方法。