我在c#中创建一个表单,所以任何新表单都继承了类From中的build属性 我还创建了一个名为program的类,它启动了与我的数据库的连接我希望我的所有表单都继承它,因为我不想为每个表单打开一个新的连接 我不能使用接口,因为程序包含main(),它创建一个连接 我的程序类是
class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
MySqlConnection myConnection = new MySqlConnection("Server=instance2813231.db.xeround.com;Port=18422;Database=shares info;Uid=user;Pwd=password;");
MySqlCommand command = myConnection.CreateCommand();
try
{
myConnection.Open();
MessageBox.Show("connected");
}
catch (Exception a)
{
Console.WriteLine(a.ToString());
MessageBox.Show("Failed");
}
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
我怎样才能解决这个问题?
答案 0 :(得分:6)
是的,不,不。为了以非常糟糕的方式实现代码重用,这是滥用继承。我希望我的所有表格都能继承它
首先,尝试将GUI代码与数据库代码分开。
其次,赞成组合而不是继承 - 表单在逻辑上不是Program
或“数据库连接开启者”。它应该使用后者,但它不是一个。你应该有一个入口点,它可以实例化它需要的东西,然后开始运行。
第三,不要在代码中使用单个连接 - 而是根据需要打开和关闭连接,并让连接池处理效率方面。
因此,不是从类派生,而是为每个表单提供对数据库连接开启器实例的引用(如果真的想要混合数据库和GUI代码... ick),然后你的表单可以使用那个开场白。
答案 1 :(得分:1)
您不能拥有多重继承,您可以做的是FormBase
继承自System.Windows.Forms.Form
,然后让所有表单都继承自FormBase
。
答案 2 :(得分:0)
C#中不能有多个类继承。但是,出于您的目的,您可以阅读connection pooling concept
连接到数据源可能非常耗时。尽量减少 打开连接的成本,ADO.NET使用优化技术 称为连接池,可最大限度地降低重复成本 打开和关闭连接。处理连接池 不同的.NET Framework数据提供程序。
答案 3 :(得分:0)
抱歉,你真的在问这个错误的问题。处理你问的问题的适当方法不是通过多重继承甚至是FormBase。您应该考虑使用Strongly Typed DataSet,LINQ-to-SQL或Entity Framework。
即使您使用的是原始ADO.NET,也不应该以这种方式挂在数据库连接上。特别是如果任何事情发生多线程,这将会严重崩溃。
不要在main中创建连接,而是在app.config中使用ConnectionString setting,并根据需要打开和关闭实际工作的连接。 connection pooling底层ADO.NET将为您减少连接设置和拆除的费用,并且不会因多线程而受到破坏。