Textbox_TextChanged事件期间的C#内存访问冲突(带有数据库)

问题描述 投票:0回答:1

我的C#应用​​程序中有一个textbox。我有一个textbox_textchanged函数,用于检查用户是否更改了其内容。如果触发此事件,它将从我的数据库中获取数据并将其放置为我的autocomplete sourcetextbox

它有时会起作用,但是大多数时候它只是将我的应用程序置于中断模式,然后显示"Memory Access Violation"

我是C#的新手,我不知道为什么会这样,我怀疑快速键入时,触发事件执行得太快,以至于mysql连接无法跟上。请帮我。 :

这里是处理Textchanged事件的函数:

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集合。有什么要紧

c# mysql access-violation memory-access
1个回答
0
投票

您需要摆脱:

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

所有这些都由using()块完成。 using()会在该块退出时自动清理您在方括号中创建的资源。这就是这个结构的重点。

当您手动处理“读取”时,使用块要整理整齐,它已经被处理了,因此我认为访问冲突。

希望这会有所帮助,

安迪

© www.soinside.com 2019 - 2024. All rights reserved.