C# 创建新实例还是覆盖?
C# Creating new instance or Overwrite?
我正在创建一个带有 SQL 服务器数据库的 C# Winform 应用程序,我在任何形式的表单 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.");
}
}
}
如您所见,每次用户 select 来自 ComboBoxes(Filters) 时都会创建新实例。
我的问题是这是否对内存和性能有不良影响,如果是这样,更好的方法是什么?
谢谢 :)
它在性能上可能没有什么降级,但它是一个很好的设计。
但是您不应该将连接存储在成员变量中。但仅限于局部变量。最好是 using(var s = new SqlConnection(..))
。这样你就可以确保 Connection 在你的方法结束时被 Disposed ,并且对它的任何引用都应该丢失,所以它可以被垃圾收集。 SqlCommand 也一样。
所以你唯一的严重错误是没有调用 Dispose
,你只调用了 Close
。
我正在创建一个带有 SQL 服务器数据库的 C# Winform 应用程序,我在任何形式的表单 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.");
}
}
}
如您所见,每次用户 select 来自 ComboBoxes(Filters) 时都会创建新实例。 我的问题是这是否对内存和性能有不良影响,如果是这样,更好的方法是什么? 谢谢 :)
它在性能上可能没有什么降级,但它是一个很好的设计。
但是您不应该将连接存储在成员变量中。但仅限于局部变量。最好是 using(var s = new SqlConnection(..))
。这样你就可以确保 Connection 在你的方法结束时被 Disposed ,并且对它的任何引用都应该丢失,所以它可以被垃圾收集。 SqlCommand 也一样。
所以你唯一的严重错误是没有调用 Dispose
,你只调用了 Close
。