【发布时间】:2020-05-11 12:30:57
【问题描述】:
我正在使用 SQL Server 数据库创建一个 C# Winform 应用程序,我以任何形式在 Form Class 中声明了一个 SqlCONnection 和一个 SqlCommand ,但我在需要时开始在每个方法中进行初始化。 这是我的代码:
public partial class DrinkIncomeForm : Form
{
#region Class Variables
private string conString;
private string queryP1;
private string queryP2;
private SqlConnection con;
private SqlCommand cmd;
private SqlDataAdapter myAdapter;
private SqlDataReader myReader;
private DataTable drinksIncomeTable;
#endregion
public DrinkIncomeForm()
{
InitializeComponent();
}
private void DrinkIncomeForm_Load(object sender, EventArgs e)
{
conString = System.Configuration.ConfigurationManager.ConnectionStrings["MyGymConString"].ConnectionString;
LoadDrinksCombo();
LoadCashierCombo();
DrinkComBox.SelectedIndex = 0;
CashierComBox.SelectedIndex = 0;
LoadDrinksIncomeDGV();
}
private void DrinkComBox_SelectedIndexChanged(object sender, EventArgs e)
{
LoadDrinksIncomeDGV();
}
private void CashierComBox_SelectedIndexChanged(object sender, EventArgs e)
{
LoadDrinksIncomeDGV();
}
private void LoadDrinksIncomeDGV()
{
con = new SqlConnection(conString);
cmd = new SqlCommand();
cmd.Connection = con;
queryP1 = "select TransID, DrinkName, Quantity, Price, Offer, format(TransDate, 'dd/MM/yyyy hh:mm:ss')as TransDate, Cashier from tblDrinksIncome ";
queryP2 = " where 1=1 ";
try
{
con.Open();
cmd.Parameters.Clear();
if(DrinkComBox.SelectedIndex >0)
{
queryP2 += " AND DrinkName=@drinkname";
cmd.Parameters.AddWithValue("@drinkname", DrinkComBox.SelectedItem.ToString());
}
if (CashierComBox.SelectedIndex >0)
{
queryP2 += " AND Cashier=@cashier";
cmd.Parameters.AddWithValue("@cashier", CashierComBox.SelectedItem.ToString());
}
cmd.CommandText = "" + queryP1 + queryP2;
myAdapter = new SqlDataAdapter(cmd);
drinksIncomeTable = new DataTable();
myAdapter.Fill(drinksIncomeTable);
DrinksIncomeDGV.DataSource = drinksIncomeTable;
con.Close();
}
catch
{
con.Close();
MessageBox.Show("Database Error.");
}
}
}
正如您在每次用户从 ComboBoxes(Filters) 中选择时看到的那样,都会创建新实例。 我的问题是这对内存和性能有不良影响,如果是这样,更好的方法是什么? 谢谢:)
【问题讨论】:
-
什么实例?即与您有关的事情是什么?实际上,这对于不是内循环数据处理场景的任何事物都不太可能成为问题。由于这似乎是 UI 绑定的,我什至不会看它 - 与正在发生的其他事情相比,这将是无关紧要的。可以优化吗?当然。有关系吗?可能至少不会。如果您想知道:测量它。如果它确实很重要,那么它可能意味着您向用户展示了太多有用的数据,所以:显示更少的数据!
-
如果它确实很重要,我要说的第一件事是:“停止使用
DataTable”。它对提高效率没有任何帮助。 -
我很关心 (DataTable,SqlConnection,SqlCommand) 的实例。每次用户更改过滤器时,函数 LoadProductsIncome() 都会创建新实例,而我不知道旧实例会发生什么!我可以用什么来代替 DataTable ?
-
一些 POCO
T的List<T>现在通常是一个安全的赌注 - 即List<Customer>、List<Order>或其他;也许看看“Dapper”如何在不自己编写代码的情况下实际填充它 -
不要在每次调用时都创建
new SqlConnection,使用单例模式或在表单打开时保持连接打开。每次都创建一个new SqlCommand就可以了。
标签: c# performance memory instance