C# Создание нового экземпляра или перезапись? - PullRequest
0 голосов
/ 25 января 2020

Я создаю C# Приложение Winform с SQL Серверной базой данных, в любой форме я объявляю 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 (Фильтры) новые экземпляры будут созданы. Мой вопрос заключается в том, что это плохо влияет на память и производительность, и если да, то как лучше это сделать? спасибо :)

1 Ответ

0 голосов
/ 25 января 2020

Это может иметь небольшое снижение производительности, но это хороший дизайн.

Но вы не должны хранить ваше соединение в переменной-члене. но только в локальной переменной. Лучше всего будет using(var s = new SqlConnection(..)). Таким образом, вы гарантируете, что Соединение будет удалено в конце вашего метода, и любая ссылка на него должна быть потеряна, чтобы ее можно было собрать мусором. То же самое относится и к SqlCommand.

Таким образом, ваша единственная критическая ошибка - не звонить Dispose, вы звоните только Close.

...