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