Нарушение доступа к памяти в C # во время события Textbox_TextChanged (с базой данных) - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть textbox в моем приложении C #.У меня есть textbox_textchanged функция, которая проверяет, изменил ли пользователь его содержимое.Если это событие инициировано, оно получит данные из моей базы данных и поместит их как autocomplete source из моих textbox.

Иногда это работает, но большую часть времени он просто переводит мое приложение в режим прерывания и затем говорит: "Memory Access Violation"

Я новичок в C # и не знаю, почему это происходитЯ подозреваю, что при быстром наборе событие триггера выполняется так быстро, что соединение mysql не может поддерживать.Помогите мне, пожалуйста.:

Вот функция, которая обрабатывает событие Textaged:

if (txtSearch.TextLength > 0)
        {

            try
            {
                using (MySqlConnection connect = new MySqlConnection(cs))
                {
                    connect.Open();
                    using (var cmd = connect.CreateCommand())
                    {
                        cmd.CommandText = "SELECT name FROM search WHERE name LIKE @sname";
                        cmd.Parameters.Add(new MySqlParameter("sname", "%" + txtSearch.Text + "%"));

                        using (MySqlDataReader read = cmd.ExecuteReader())
                        {

                            AutoCompleteStringCollection collect = new AutoCompleteStringCollection();
                            while (read.Read())
                            {
                                collect.Add(read.GetString(0));
                            }
                            connect.Close();
                            read.Close();
                            read.Dispose();
                            txtSearch.AutoCompleteCustomSource = collect;
                        }

                    }


                }
            }
            catch (Exception ex)
            {
                error(ex.Message, "Error");
            }




        }
    }

Это сообщение об ошибке:

Ваше приложение вошло в состояние останова, но неткод для отображения, потому что все потоки выполняли внешний код (обычно системный или структурный код).

System.AccessViolationException: 'Попытка чтения или записи защищенной памяти.Это часто указывает на то, что другая память повреждена. '

Это должно только обновить коллекцию Autocomplete моего текстового поля.Что Материя

1 Ответ

0 голосов
/ 19 сентября 2019

Вам нужно избавиться от:

connect.Close();
read.Close();
read.Dispose();

Все, что делается с помощью блоков using ().Использование () AutomaticLaly очищает ресурс, который вы создаете в скобках при выходе из блока.В этом весь смысл этой структуры.

Когда вы вручную выводите «read», когда блок using приходит в порядок, он уже удален, поэтому я считаю нарушение доступа.

Hopeэто помогает,

Энди

...