請教c#賦值變數不生效問題
//在C#中創建一個類
class Conn
{
private static string cn="Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pswd;
public static SqlConnection rs = new SqlConnection(cn);
public static string pswd;
}
//創建一個表單
private void Form1_Load(object sender, EventArgs e)
{
Conn.pswd="abc123";
string sql = "Select * From tTable Where tID='1'";
SqlCommand cmd = new SqlCommand(sql, Conn.rs);
Conn.rs.Open();
SqlDataReader dr = cmd.ExecuteReader();
dr.Read();
this.Text = dr["LoginTitle"].ToString();
dr.Close();
cmd.Clone();
Conn.rs.Close();
}
請教大家,為什么密碼賦值不生效。
表單Form1_Load中 已經賦值Conn.pswd="abc123" 密碼還是不生效,如何才能生效。
我想做一個全域變數Conn.pswd,讓所有表單Form1,Form2,Form3..也是保持這個密碼。
密碼abc123是從其他資料庫取出來的。
請教大家一下,幫忙看看,謝謝大家!
uj5u.com熱心網友回復:
物件 rs 定義的時候已經初始化過了(rs 的成員都是靜態的),使用的密碼是未賦值的 pswd;然后你給 pswd 賦值,但是這不會更新 rs 的連接字串,你需要再次生成新的連接字串才行。 簡單的辦法是將成員 pswd 設定為屬性而不是簡單的變數,然后在修改該屬性時使用代碼重新生成連接字串。uj5u.com熱心網友回復:
請教如何修改以上的代碼,才可以解決呢?uj5u.com熱心網友回復:
你這個都沒有關聯起來,肯定沒用
class Conn
{
public static SqlConnection rs;
public static void SetPwd(string pwd)
{
rs = new SqlConnection("Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pwd);
}
}
uj5u.com熱心網友回復:
在靜態變數Conn.pswd賦值后,(string cn="Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + Conn.pswd;)這段代碼需寫在當前視窗Form1_Load中。
如果你要使用全域的Conn.pswd,而且又需要在不同的表單中單獨賦值,那么連接字串cn就不能在Conn類中寫成靜態的。就需要在當前的視窗中重新生成連接字串cn。
如果,要全部在Conn類中寫成靜態的,那么就必須在Conn類中先賦值。
uj5u.com熱心網友回復:
請教一下2樓,我的private static string cn="Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pswd;這個是private
uj5u.com熱心網友回復:
你去試試嘛 這又沒有影響 為何一定要private呢 又沒在其他地方用
uj5u.com熱心網友回復:
3樓應該是正解哈uj5u.com熱心網友回復:
private static string cn="Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pswd;這個一定要用成private 規定好的。
請教有什么方法,加其他東西來影響以上的嗎?
例如加 public static string Uk{get;set;}
uj5u.com熱心網友回復:
3樓的方法不行挺好,為什么堅持己見呢?你不是為了寫垃圾代碼的吧?給你一顆挺拔的白楊樹不要,你就要歪脖子樹。可千萬不要把這種態度帶到做專案上去,那是要給別人挖坑的。
uj5u.com熱心網友回復:
public static void SetPwd(string pwd){
rs = new SqlConnection("Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pwd);
}
請教一下2樓,這個如何設定成private 專案多了之后,不適合public
uj5u.com熱心網友回復:
不要教壞新手。保持類中任何沒必要開放給外界訪問的方法和程序都為private其實是個挺好的習慣。更何況是資料庫連接字串這種東西。C#的訪問器非常好用,你要不要考慮一下靜態也是可以用的,get訪問器保證了每一次想要獲取cn的值的時候都會看一眼你的連接密碼。
代碼如下:
class Conn
{
private static string cn
{
get
{
return "Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pswd;
}
}
public static SqlConnection rs = new SqlConnection(cn);
public static string pswd;
}
uj5u.com熱心網友回復:
謝謝11樓 混世生 的支持。private 確實很規范。測驗了您的代碼后,發現密碼賦值后還是不生效。
表單Form1_Load中 已經賦值Conn.pswd="abc123" 密碼還是不生效,代碼如何改才能解決。
我想做到的是,只需在表單Form1賦值密碼后。其他表單都可以保持用這密碼了。
因為,Form1是從其他資料庫取出來的密碼,然后賦值到pswd里。Form2,Form3..所有表單都能公用了。
請教大家如何解決。謝謝!
uj5u.com熱心網友回復:
你要理解
public static SqlConnection rs = new SqlConnection(cn);
你的這一段代碼,由于是靜態物件,所以在你form1的Load方法執行之前,他的物件就已經實體化完成了。所以實體化的時候pswd是空的,后續就算你再去修改pswd內容,你的rs物件也是不會有任何改變的。
這就像你去銀行取錢,你對ATM說“把這張卡里所有的錢都取到我的錢包里!”由于你卡里沒錢,然后你的錢包里一毛錢都沒有。
然后你網銀轉賬100塊到銀行卡內,這時候你銀行卡確實有100塊,但你的錢包仍然是空的,這里你的rs就是你錢包里的錢。
pswd就是你的銀行卡。
所以要實作你的需求,你的邏輯應該是先存錢到銀行卡內,然后再取錢,也就是你要先對pswd賦值,然后再實體化rs物件
uj5u.com熱心網友回復:
有點走偏了,樓主的問題與 private 沒什么關聯,純粹是邏輯理解問題。舉個例子:
int a = 1;
int b = a + 1;
a = 2;
按順序執行完后 a 和 b 的值分別是幾?b 會是 3 嗎?
uj5u.com熱心網友回復:
15樓的b是不是2啊?uj5u.com熱心網友回復:
明白你的意思了,我的失誤還有一個訪問器叫set
代碼如下:
class Conn
{
private static string cn
{
get
{
return "Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pswd;
}
}
public static SqlConnection rs = new SqlConnection(cn);
private static string pw;
public static string pswd
{
get
{
return pw;
}
set
{
pw = value;
rs = new SqlConnection(cn);
}
}
}
uj5u.com熱心網友回復:
SqlConnection不要也不應該搞成static的(這是初學者的毛病),你改成非靜態的,他的代碼就有用了。
但是!沒有誰是在get訪問器里去初始化一個資料庫連接串的,這是炫技,而且是初學者的炫技。我們老家伙是很樸實的。我們追求的是,程式好讀,穩定,不讓別人意外。正途就是3樓。
uj5u.com熱心網友回復:
同意18樓,一般情況下connection確實不應該是static。但你居然說訪問器這種基礎的東西叫炫技讓我難以理解。還帶人身攻擊就更讓人BS了。@樓主,如果是我寫,而且一定要寫成static,我會這么寫:
public static class Conn
{
private static System.Data.SqlClient.SqlConnection sqlConn;
private static String password = "default password";
private static String mask = "Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd={0}";
public static System.Data.SqlClient.SqlConnection Sql(String pw = "")
{
if (pw != "" && pw != password)
{
password = pw;
sqlConn = null;
}
if (sqlConn == null)
{
string str = String.Format(mask, password);
sqlConn = new System.Data.SqlClient.SqlConnection(str);
}
return sqlConn;
}
}
使用時需要修改密碼的時候
Conn.Sql("new password");其他時候直接
Conn.Sql();
uj5u.com熱心網友回復:
哈不好意思,我其實是想批評樓主,沒想到你中槍了。
uj5u.com熱心網友回復:
因為是樓主提出來要在get訪問器里做文章的,然后你按他的思路寫了案例,我想這不代表你平時是這么做的。@混世生uj5u.com熱心網友回復:
請教一下21樓 圣殿騎士18如果您寫資料庫連接的時候,代碼是如何寫呢?
不吝賜教,可以寫一段,我參考一下嗎?謝謝您!
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/29707.html
標籤:C#
上一篇:求幫忙
