请教c#赋值变量不生效问题

xiehuangda 2020-06-22 12:32:51
请教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是从其他数据库取出来的。
请教大家一下,帮忙看看,谢谢大家!
...全文
4172 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
Hunshy 2020-06-23
  • 打赏
  • 举报
回复
不要教坏新手。保持类中任何没必要开放给外界访问的方法和过程都为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;
	}
圣殿骑士18 2020-06-23
  • 打赏
  • 举报
回复
引用 12 楼 xiehuangda 的回复:
谢谢11楼 混世生 的支持。private 确实很规范。 测试了您的代码后,发现密码赋值后还是不生效。 窗体Form1_Load中 已经赋值Conn.pswd="abc123" 密码还是不生效,代码如何改才能解决。 我想做到的是,只需在窗体Form1赋值密码后。其他窗体都可以保持用这密码了。 因为,Form1是从其他数据库取出来的密码,然后赋值到pswd里。Form2,Form3..所有窗体都能公用了。 请教大家如何解决。谢谢!
SqlConnection不要也不应该搞成static的(这是初学者的毛病),你改成非静态的,他的代码就有用了。 但是!没有谁是在get访问器里去初始化一个数据库连接串的,这是炫技,而且是初学者的炫技。我们老家伙是很朴实的。我们追求的是,程序好读,稳定,不让别人意外。正途就是3楼。
Hunshy 2020-06-23
  • 打赏
  • 举报
回复
引用 12 楼 xiehuangda 的回复:
谢谢11楼 混世生 的支持。private 确实很规范。 测试了您的代码后,发现密码赋值后还是不生效。 窗体Form1_Load中 已经赋值Conn.pswd="abc123" 密码还是不生效,代码如何改才能解决。 我想做到的是,只需在窗体Form1赋值密码后。其他窗体都可以保持用这密码了。 因为,Form1是从其他数据库取出来的密码,然后赋值到pswd里。Form2,Form3..所有窗体都能公用了。 请教大家如何解决。谢谢!
明白你的意思了,我的失误还有一个访问器叫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);
            }
        }
    }
JWJW886 2020-06-23
  • 打赏
  • 举报
回复
15楼的b是不是2啊?
xiehuangda 2020-06-23
  • 打赏
  • 举报
回复
请教一下21楼 圣殿骑士18 如果您写数据库连接的时候,代码是如何写呢? 不吝赐教,可以写一段,我参考一下吗?谢谢您!
datafansbj 2020-06-23
  • 打赏
  • 举报
回复
有点走偏了,楼主的问题与 private 没什么关联,纯粹是逻辑理解问题。
举个例子:

int a = 1;
int b = a + 1;
a = 2;

按顺序执行完后 a 和 b 的值分别是几?b 会是 3 吗?
蜗牛慢慢趴 2020-06-23
  • 打赏
  • 举报
回复
引用 12 楼 xiehuangda 的回复:
谢谢11楼 混世生 的支持。private 确实很规范。 测试了您的代码后,发现密码赋值后还是不生效。 窗体Form1_Load中 已经赋值Conn.pswd="abc123" 密码还是不生效,代码如何改才能解决。 我想做到的是,只需在窗体Form1赋值密码后。其他窗体都可以保持用这密码了。 因为,Form1是从其他数据库取出来的密码,然后赋值到pswd里。Form2,Form3..所有窗体都能公用了。 请教大家如何解决。谢谢!
你要理解
public static SqlConnection rs = new SqlConnection(cn);
你的这一段代码,由于是静态对象,所以在你form1的Load方法执行之前,他的对象就已经实例化完成了。所以实例化的时候pswd是空的,后续就算你再去修改pswd内容,你的rs对象也是不会有任何改变的。 这就像你去银行取钱,你对ATM说“把这张卡里所有的钱都取到我的钱包里!”由于你卡里没钱,然后你的钱包里一毛钱都没有。 然后你网银转账100块到银行卡内,这时候你银行卡确实有100块,但你的钱包仍然是空的,这里你的rs就是你钱包里的钱。 pswd就是你的银行卡。 所以要实现你的需求,你的逻辑应该是先存钱到银行卡内,然后再取钱,也就是你要先对pswd赋值,然后再实例化rs对象
圣殿骑士18 2020-06-23
  • 打赏
  • 举报
回复
因为是楼主提出来要在get访问器里做文章的,然后你按他的思路写了案例,我想这不代表你平时是这么做的。@混世生
圣殿骑士18 2020-06-23
  • 打赏
  • 举报
回复
引用 19 楼 混世生 的回复:
同意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();
哈不好意思,我其实是想批评楼主,没想到你中枪了。
xiehuangda 2020-06-23
  • 打赏
  • 举报
回复
谢谢11楼 混世生 的支持。private 确实很规范。 测试了您的代码后,发现密码赋值后还是不生效。 窗体Form1_Load中 已经赋值Conn.pswd="abc123" 密码还是不生效,代码如何改才能解决。 我想做到的是,只需在窗体Form1赋值密码后。其他窗体都可以保持用这密码了。 因为,Form1是从其他数据库取出来的密码,然后赋值到pswd里。Form2,Form3..所有窗体都能公用了。 请教大家如何解决。谢谢!
Hunshy 2020-06-23
  • 打赏
  • 举报
回复
同意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();
xiehuangda 2020-06-22
  • 打赏
  • 举报
回复
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
圣殿骑士18 2020-06-22
  • 打赏
  • 举报
回复
引用 8 楼 xiehuangda 的回复:
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;}
3楼的方法不行挺好,为什么坚持己见呢?你不是为了写垃圾代码的吧?给你一颗挺拔的白杨树不要,你就要歪脖子树。可千万不要把这种态度带到做项目上去,那是要给别人挖坑的。
xiehuangda 2020-06-22
  • 打赏
  • 举报
回复
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;}
  • 打赏
  • 举报
回复
3楼应该是正解哈
  • 打赏
  • 举报
回复
引用 5 楼 xiehuangda 的回复:
请教一下2楼,我的private static string cn="Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pswd;
这个是private

你去试试嘛 这又没有影响 为何一定要private呢 又没在其他地方用
xiehuangda 2020-06-22
  • 打赏
  • 举报
回复
请教一下2楼,我的private static string cn="Data Source=192.168.1.8,1433;Initial Catalog=Data2020;User ID=sa;pwd=" + pswd; 这个是private
谭继周 2020-06-22
  • 打赏
  • 举报
回复
在静态变量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类中先赋值。
  • 打赏
  • 举报
回复
你这个都没有关联起来,肯定没用

    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);
        }
    }
xiehuangda 2020-06-22
  • 打赏
  • 举报
回复
请教如何修改以上的代码,才可以解决呢?
加载更多回复(1)
net的最近面试经典试题ASP.NET面试题集合 1. 简述 private、 protected、 public、 internal 修饰符的访问权限。 答 . private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成员,完全公开,没有访问限制。 internal: 在同一命名空间内可以访问。 2 .列举ASP.NET 页面之间传递值的几种方式。 答. 1.使用QueryString, 如....?id=1; response. Redirect().... 2.使用Session变量 3.使用Server.Transfer 3. 一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现。 答:public class MainClass { public static void Main() { Console.WriteLine(Foo(30)); } public static int Foo(int i) { if (i 0 && i <= 2) return 1; else return Foo(i -1) + Foo(i - 2); } } 4.C#中的委托是什么?事件是不是一种委托? 答 : 委托可以把一个方法作为参数代入另一个方法。 委托可以理解为指向一个函数的引用。 是,是一种特殊的委托 5.override与重载的区别 答 : override 与重载的区别。重载是方法的名称相同。参数或参数类型不同,进行多次重载以适应不同的需要 Override 是进行基类中函数的重写。为了适应需要。 6.如果在一个B/S结构的系统中需要传递变量值,但是又不能使用Session、Cookie、Application,您有几种方法进行处理? 答 : this.Server.Transfer 7.请编程遍历页面上所有TextBox控件并给它赋值为string.Empty? 答: foreach (System.Windows.Forms.Control control in this.Controls) { if (control is System.Windows.Forms.TextBox) { System.Windows.Forms.TextBox tb = (System.Windows.Forms.TextBox)control ; tb.Text = String.Empty ; } } 8.请编程实现一个冒泡排序算法? 答: int [] array = new int ; int temp = 0 ; for (int i = 0 ; i < array.Length - 1 ; i++) { for (int j = i + 1 ; j < array.Length ; j++) { if (array[j] < array) { temp = array ; array = array[j] ; array[j] = temp ; } } } 9.描述一下C#中索引器的实现过程,是否只能根据数字进行索引? 答:不是。可以用任意类型。 10.求以下表达式的值,写出您想到的一种或几种实现方法: 1-2+3-4+……+m [Page] 答: int Num = this.TextBox1.Text.ToString() ; int Sum = 0 ; for (int i = 0 ; i < Num + 1 ; i++) { if((i%2) == 1) { Sum += i ; } else { Sum = Sum - I ; } } System.Console.WriteLine(Sum.ToString()); System.Console.ReadLine() ; 11.用.net做B/S结构的系统,您是用几层结构来开发,每一层之间的关系以及为什么要这样分层? 答:一般为3层 数据访问层,业务层,表示层。 数据访问层对数据库进行增删查改。 业务层一般分为二层,业务表观层实现与表示层的沟通,业务规则层实现用户密码的安全等。 表示层为了与用户交互例如用户添加表单。 优点: 分工明确,条理清晰,易于调试,而且具有可扩展性。 缺点: 增加成本。 12.在下面的例子里 using Sy

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧