我是c#的新手并使用Windows窗体。
我正在构建一个包含大约25 Forms
和25 user controls
的项目,这些Forms
和user controls
中的每一个都使用SQL数据库从数据库中读取数据(请注意,我在app.config
文件中使用连接字符串。
如代码所示,我总是将sql查询放在50个Form / user控件构造函数中,以便从数据库中读取数据(例如控件文本和其他东西);
我的程序运行正常没有问题,但想象当我运行程序时,所有25 forms
和25 user controls
将“同时”查询数据库,这让我觉得我在做有些不对劲,可能会在我的程序中出现副作用。
我不知道将查询置于构造函数中是否正确(例如按钮文本查询)?
另外我觉得25 Forms
和25 user controls
在运行时同时攻击SQL数据库是否有办法减少与数据库的连接数?请指导我。谢谢
public partial class SubMenu1 : UserControl
{
SqlConnection MyConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString);
SqlCommand MyCommand = new SqlCommand();
DataTable DataTable = new DataTable();
SqlDataAdapter Sql_Data_Adapter = new SqlDataAdapter();
public SubMenu1()
{
InitializeComponent();
DataTable.Rows.Clear();
DataTable.Columns.Clear();
MyConnection.Open();
MyCommand.CommandText = "SELECT * FROM Table21 ";
MyCommand.Connection = MyConnection;
Sql_Data_Adapter.SelectCommand = MyCommand;
Sql_Data_Adapter.Fill(DataTable);
MyConnection.Close();
}
public void MyFunction()
{
// Do some stuff with the DataTable ...
}
}
答案 0 :(得分:3)
你的代码有很多问题。首先不要使用全局连接,有Connection Pool。
连接池减少了新连接的次数 必须打开。平民保持对物质的所有权 连接。它通过保持一组活动来管理连接 每个给定连接配置的连接。每当一个用户 调用在连接上打开,pooler查找可用的 池中的连接。如果池连接可用,则为 将其返回给调用者而不是打开新连接。当。。。的时候 应用程序调用关闭连接,pooler将其返回 合并的一组活动连接而不是关闭它。一旦 连接返回到池中,它已准备好在池上重用 下一次公开电话。
此外,您应该在使用或在try / catch / finally块中使用连接。这是必需的,因为如果发生某些异常,连接永远不会是Closed
,当您尝试重用它时会导致异常,或者它将永远不会返回到连接池。
再次使用块包装SqlDataAdapter,需要在完成工作后关闭适配器。您需要调用Dispose
,因此SqlAdapter会释放组件使用的所有资源。这是每个IDisposable
对象的规则。如果您不进行处理,则处理将在GC终结器上进行,但何时执行将由GC决定。因此,不处理此对象可能会产生高成本。这篇关于IDisposable
我建议您创建单独的数据访问层,我在此问题中做了一个简单的显示设计问题:checking user name or user email already exists
如果您不想要单独的数据访问层,您的代码应如下所示:
public partial class SubMenu1 : UserControl
{
public SubMenu1()
{
InitializeComponent();
}
public void MyFunction()
{
DataTable dataTable = new DataTable();
using(SqlConnection myConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MyConnectionString"].ConnectionString))
using(SqlDataAdapter sqlDataAdapter = new SqlDataAdapter())
{
myConnection.Open();
SqlCommand myCommand = new SqlCommand();
myCommand.CommandText = "SELECT * FROM Table21";
myCommand.Connection = myConnection;
sqlDataAdapter.SelectCommand = myCommand;
sqlDataAdapter.Fill(dataTable);
}
if(dataTable.Rows.Count > 0)
{
//do stuff ....
}
}
}
答案 1 :(得分:-2)
使用静态连接成员创建类。 所有表单/控件都将获得此连接并使用它。 在app shutdown上关闭此连接。