我的C#应用程序中有一个textbox
。我有一个textbox_textchanged
函数,可以检查用户是否更改了其内容。如果触发此事件,它将从我的数据库中获取数据并将其作为我的textbox
的autocomplete source
。
它有时有效,但大多数时候它只是将我的应用程序置于中断模式,然后说"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: 'Try Read or write protected 记忆。这通常表明其他内存已损坏。
它应该只更新我的文本框的Autocomplete
集合。怎么回事
你需要摆脱:
connect.Close();
read.Close();
read.Dispose();
using(( 块所做的一切都会在块退出时自动清理您在括号中创建的资源。这就是这个结构的重点。
当您手动处理"读取"时,当使用块整理时,它已经被处理掉了,因此我认为访问违规。
希望这有帮助,
安 迪