我的C#应用程序中有一个textbox
。我有一个textbox_textchanged
函数,用于检查用户是否更改了其内容。如果触发此事件,它将从我的数据库中获取数据并将其放置为我的autocomplete source
的textbox
。
它有时会起作用,但是大多数时候它只是将我的应用程序置于中断模式,然后显示"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
集合。有什么要紧
您需要摆脱:
connect.Close();
read.Close();
read.Dispose();
所有这些都由using()块完成。 using()会在该块退出时自动清理您在方括号中创建的资源。这就是这个结构的重点。
当您手动处理“读取”时,使用块要整理整齐,它已经被处理了,因此我认为访问冲突。
希望这会有所帮助,
安迪