我收到此错误:
尝试读取或写入受保护的内存。这通常表明其他内存已损坏。
运行此代码时:
namespace ProjectInterface
{
static class Program
{
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1()); -exception unhandled(error)!!!!
}
}
}
当我从数据库中搜索主题名称时。
这是我的文本框代码:
private void txtSubject_TextChanged(object sender, EventArgs e)
{
con.Open();
MySqlCommand cmd = new MySqlCommand("SELECT SubjectName From databse.subject WHERE SubjectName LIKE @name", con);
cmd.Parameters.Add(new MySqlParameter("@name", "%" + txtSubject.Text + "%"));
MySqlDataReader dr = cmd.ExecuteReader();
AutoCompleteStringCollection subjectColl = new AutoCompleteStringCollection();
while (dr.Read())
{
subjectColl.Add(dr.GetString(0));
}
txtSubject.AutoCompleteCustomSource = subjectColl;
con.Close();
}
有时可以运行,但它经常显示此错误。我该如何解决?
答案 0 :(得分:0)
我在代码中可以识别的唯一问题(因为缺少某些信息)是每次键入字符时,都会进行数据库查询并在同一个线程上执行此操作(UI如果查询需要2秒才能完成,那么键入每个字符需要2秒才能输入。对用户来说非常糟糕的经历。
对于MySQL语句本身,它没有任何内在错误,尽管我确实认为这是你问题的原因。
首先我想说明为什么你有线程问题你应该先了解线程。我在这里制作了一个视频https://www.youtube.com/watch?v=XXg9g56FS0k和https://www.youtube.com/watch?v=S0jPzb9kk3o
在您了解问题后,您应该能够安全地将呼叫转移到另一个线程上。然而,您将有另一个问题...然后,如果每个调用需要2个seconsd,并且用户在那个时间键入10个字符,您将进行10个数据库调用。然而,由于这不是我在这个问题上的问题,我不想在解决一个无关的问题上留下长篇大论。
因此,从给定数量的代码和细节,我可以非常安全地说(99.95%)导致内存异常的代码必须来自MySQL调用。由于您没有提供用于MySQL的库/ dll /引用,我可以简单地假设您可能使用旧的或错误的版本。
导致同样问题的MySQL驱动程序示例是Asp.net Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
如果你还没有,并希望解决你的问题,我建议你使用的是这个版本的维护库,用于处理MySQL https://www.nuget.org/packages/Mysql.Data/
如果您仍然遇到问题并且您正在使用它,我会开始怀疑数据库本身或网络是间歇性的并导致错误。
一个重要的注意事项是,您应该在Visual Studio中启用所有错误捕获,然后按 Ctrl + Alt + E 并选中每个框。然后,当您收到此错误时,它应该直接转到它失败的确切代码行,我们可以进一步调查