我有一个
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
类?或者是否有更好的方法以“良好的编码实践”的形式来处理这个问题?
(例如,考虑到多线程,即使目前没有计划。)
如果您只创建一个 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()