Я мог бы иметь никаких проблем с производительностью, если я делаю проверку личности при использовании очередь textchanged в текстовое поле каждый раз, когда пользовательский тип персонажа?


У меня была идея проверить, если id запись уже существует в базе данных. Если это не так нет смысла удалять не существующую запись.

Поэтому, когда пользователь затем каждый раз, когда новый символ добавляется я Открытие или закрытие подключения к моему файлу базы данных. Это моя забота.

Но что, если там может быть сотых записи? Могло ли это вызвать проблемы с производительностью? Если да, то как я могу избежать этого?

Вот мой код:

namespace Password_Manager
{
    public partial class DeleteEntryWindow : Form
    {
        string user, pass, filePath;

        // Initializing MainWindow form.
        MainWindow mainWindow;

        public DeleteEntryWindow()
        {
            InitializeComponent();

            // Creating an EventHandler for textbox when text is chaned.
            txtEntryID.TextChanged += new EventHandler(ValidateInput);
        }

        public DeleteEntryWindow(MainWindow viaParameter, 
            string user, string pass, string filePath)
            : this()
        {
            mainWindow = viaParameter;
            this.user = user;
            this.pass = pass;
            this.filePath = filePath;
        }

        private void ValidateInput(object sender, EventArgs e)
        {
            int intNumber = 0;

            // Checking if input is empty, not a number, or is less than 1.
            if (!string.IsNullOrEmpty(txtEntryID.Text) &&
                int.TryParse(txtEntryID.Text, out intNumber) &&
                intNumber > 0)
            {
                lblMessage.Text = "Entry ID is valid.";
                lblMessage.ForeColor = Color.Green;
                btnDeleteEntry.Enabled = true;
            }
            else
            {
                lblMessage.Text = "You must enter Entry ID number!";
                lblMessage.ForeColor = Color.IndianRed;
                btnDeleteEntry.Enabled = false;
            }

            if (!DoesIDExist(intNumber, filePath))
            {
                lblMessage.Text = "Entry ID doesn't exist!";
                lblMessage.ForeColor = Color.IndianRed;
                btnDeleteEntry.Enabled = false;
            }
        }

        private void btnDeleteEntry_Click(object sender, EventArgs e)
        {
            DialogResult result = MessageBox.Show
                ("Are you sure you want to remove this entry?",
                "Information", MessageBoxButtons.YesNo,
                MessageBoxIcon.Information);

            if (result == DialogResult.Yes)
            {
                // SQL query which will delete entry by using entry ID.
                string sql = "DELETE FROM PersonalData WHERE DataID = " +
                    txtEntryID.Text;

                DeleteData(sql);

                lblMessage.Text = "Entry was deleted!";
                lblMessage.ForeColor = Color.Green;
            }
            else
            {
                // Do nothing.
            }
        }

        private void DeleteData(string sql)
        {
            HashPhrase hash = new HashPhrase();

            string hashShortPass = hash.ShortHash(pass);

            // Creating a connection string. Using placeholders make code
            // easier to understand.
            string connectionString =
                @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};
                  Persist Security Info=False; Jet OLEDB:Database Password={1};";

            using (OleDbConnection connection = new OleDbConnection())
            {
                // Creating command object.
                // Using a string formatting let me to insert data into
                // place holders I have used earlier.
                connection.ConnectionString =
                    string.Format(connectionString, filePath, hashShortPass);

                using (OleDbCommand command = new OleDbCommand(sql, connection))
                {
                    OleDbParameter prmDataID = new OleDbParameter
                        ("@DataID", txtEntryID.Text);

                    command.Parameters.Add(prmDataID);

                    try
                    {
                        connection.Open();
                        command.ExecuteNonQuery();
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.Message);
                    }
                }
            }

            // Refreshing state of main window.
            mainWindow.DisplayFileContent(filePath);

            lblMessage.Text = "Data was successfully deleted.";
            lblMessage.ForeColor = Color.Green;

            // Clearing text box field.
            txtEntryID.Clear();
        }

        private bool DoesIDExist(int dataID, string filePath)
        {
            HashPhrase hash = new HashPhrase();
            DataTable temp = new DataTable();

            string hashShortPass = hash.ShortHash(pass);
            bool result = false;

            // Creating a connection string. Using placeholders make code
            // easier to understand.
            string connectionString =
                @"Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0};
                  Persist Security Info=False; Jet OLEDB:Database Password={1};";

            string sql = string.Format
                ("SELECT * FROM PersonalData WHERE [DataID] = {0}", dataID);

            using (OleDbConnection connection = new OleDbConnection())
            {
                // Creating command object.
                // Using a string formatting let me to insert data into
                // place holders I have used earlier.
                connection.ConnectionString =
                    string.Format(connectionString, filePath, hashShortPass);

                using (OleDbCommand command = new OleDbCommand(sql, connection))
                {
                    // Creating command object.
                    // Using a string formatting let me to insert data into
                    // place holders I have used earlier.
                    connection.ConnectionString =
                        string.Format(connectionString, filePath, hashShortPass);

                    try
                    {
                        // Open database connection.
                        connection.Open();

                        using (OleDbDataReader read = command.ExecuteReader())
                        {
                            // Checking if there is any data in the file.
                            if (read.HasRows)
                            {
                                // Reading information from the file.
                                while (read.Read())
                                {
                                    if (read.GetInt32(0) == dataID)
                                        return true;
                                }
                            }
                        }
                    }
                    catch (Exception ex)
                    {
                        MessageBox.Show("Error: " + ex.Message);
                    }
                }
            }

            return result;
        }
    }
}


559
2
задан 6 декабря 2011 в 02:12 Источник Поделиться
Комментарии
2 ответа

Настройка подключения к базе данных на каждой ручке будет очень медленно. Вы бы лучше бежать первоначальный вызов к базе данных, который извлекает идентификатор хранится в нем и кэширует результаты в коде. Затем, когда вы выполняете проверку, просто сделать вид, внутри этот кэш. Что будет гораздо быстрее проверить. Так как вы используете целочисленные значения ID, вы могли бы оптимизировать это дальнейшее хранение идентификатора результаты в массив, который можно сортировать. Вы можете затем использовать массив.Ищет(...) для запуска ускорения поиска.

Примечание: используя этот подход, ваш проверка не обязательно будет работать на последний набор значений идентификаторов (если они могут быть обновлены отдельно). В таком случае, либо вы должны запустить "обновить" на базе регулярно, или изменить ваш проверка будет медленнее, убедитесь, что выполняется после того, как пользователь закончил изменение текста (не на каждое изменение).

2
ответ дан 6 декабря 2011 в 03:12 Источник Поделиться

Это возможно (повторяю: возможно) будет неприемлемо медленно для пользователей, которые типа быстро, но опять же это будет, вероятно, работать лучше, чем вы могли бы ожидать. Попробуйте добавить некоторые поддельные данные в вашу базу данных, чтобы проверить производительность системы прежде чем что-то оптимизировать. Если выяснится, что есть проблемы с производительностью, попробуйте открыть соединение, когда 'DeleteEntryWindow' открывается, и закрывается при его закрытии. Убедитесь, что индекс был определен в базе данных для DataID. Если есть еще проблемы с производительностью, затем переместите проверка кода в отдельном потоке. Не делать трюки, как кэширование идентификаторов в массиве, вы будете сожалеть об этом позже.

0
ответ дан 8 декабря 2011 в 05:12 Источник Поделиться