如何从不同的类访问变量?

问题描述 投票:0回答:1

我有一个

UserControl
课程、一个
Main
表格课程和一个
DbConn
课程。

我想从其他两个类“作为中间人”访问 DbConn 类。因此,UserControl 应设置 DbConn-Class 的字符串,而主表单类应再次从中读取该字符串。

(或者现在应该这样做。稍后,这个 DbConn 类应该跟踪连接信用并处理与我的数据库的所有连接内容,以便在各个部分之间获得一些清晰的信息。目前,所有内容都在主表单类中,但是如果我不将类划分为不同的类(它应该只处理一件事,例如 DatabaseConnection、不同的 Frontendparts 等),那么按照计划添加,此代码将很难维护。)

这是

UserControl
班级:

namespace mySQL_Project
{
    public partial class SettingsControl : UserControl
    {
        DbConn dbConn = new DbConn();

        public SettingsControl()
        {
            InitializeComponent();
        }
        private void Button_SetDB_Click(object sender, EventArgs e)
        {
            String connectString = tb_stringtext;
            dbConn.connParamNewSQLite(connectString);
        }
    }
}

这是

Main
班级:

namespace mySQL_Project
{
    public partial class Main : Form
    {
        DbConn dbConn = new DbConn();

        public Main()
        {
            InitializeComponent();
        }
        private void textBox_getDBConn_Click(object sender, EventArgs e)
        {
           label_dbinfo.Text = dbConn.connParamGetSQLite(); //should get Text set in userControl
        }
    }
}

这是

DbConn
课程:


namespace mySQL_Project
{
    internal class DbConn
    {
        private string conn;
        public void connParamNewSQLite(string connectionString)
        {
            conn = connectionString;
        }

        public string connParamGetSQLite()
        {
            return conn;
        }

        public int DbGetSumApples(){
            cmd = new SQLiteCommand();
            cmd.CommandText = @"SELECT sum FROM inv WHERE ID=@AI";
            cmd.Parameters.AddWithValue("@AI", "3"); //Apple-ID
            cmd.Connection = conn;
            return cmd.ExecuteScalar().ToString();
        }
    }
}

但这并没有给我在 UserControl-Class 中设置的字符串。

想法是拥有类似全局变量的东西。 例如。该类已通过

connParamNewSQLite()
函数从一个类传入一些连接变量,另一个类将使用同一
DbGetSumApples()
类中的
DbConn
函数来建立与数据库的连接。然后
DbGetSumApples()
函数将需要
connParamNewSQLite()
函数之前传递的连接参数。
DbGetSumApples()
函数不会按原样工作,但我希望弄清楚,
DbConn
类最终应该做什么。此外,
DbConn
类被实例化两次,否则我无法使用第二类中的函数

我应该在代码中更改什么,以便两个类都知道

DbConn
类?或者是否有更好的方法以“良好的编码实践”的形式来处理这个问题? (例如,考虑到多线程,即使目前没有计划。)

c# winforms class frameworks global-variables
1个回答
0
投票

如果您只创建一个 DbConn 类,那么您可以将其实现为单例。

public sealed class DbConn
{
    private static DbConninstance = null;
    private static readonly object padlock = new object();
    private string conn;

    public static DbConn Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new DbConn();
                }
                return instance;
            }
        }
    }
    public void connParamNewSQLite(string connectionString)
    {
        conn = connectionString;
    }

    public string connParamGetSQLite()
    {
        return conn;
    }

    public int DbGetSumApples(){
        cmd = new SQLiteCommand();
        cmd.CommandText = @"SELECT sum FROM inv WHERE ID=@AI";
        cmd.Parameters.AddWithValue("@AI", "3"); //Apple-ID
        cmd.Connection = conn;
        return cmd.ExecuteScalar().ToString();
    }
}

这样就不需要全局变量了。相反,您现在可以从其他类调用它,只需像这样调用它

DbConn.Instance.DbGetSumApples()

© www.soinside.com 2019 - 2024. All rights reserved.