我得到此错误:
试图读取或写下受保护的内存。这通常表明其他内存已损坏。
运行此代码时:
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();
}
有时可以运行,但通常会显示此错误。我该如何解决?
与代码
发行我唯一可以在您提供的代码中识别的唯一问题(因为缺少某些信息(是,每次键入字符时,您都会进行数据库查询,然后在同一线程上执行此操作(一个UI即将打开(,因此,如果查询需要2秒钟才能完成,则您的打字将需要每个字符2秒才能输入。用户的经验非常糟糕。
对于MySQL语句本身,没有任何本质上的错误,尽管我确实相信这是您问题的原因。
修复UI线程
首先,我要说的是要了解为什么您应该首先了解线程。我在这里制作了视频https://www.youtube.com/watch?v=xxg9g56fs0k,这里https://www.youtube.com/watch?v=s0jpzb9kkkkkkkkk3o
了解问题后,您应该可以将呼叫安全地放到另一个线程上。但是,您将遇到另一个问题...然后,如果每个呼叫都采用2个SECONSD,那么在那个时候用户键入10个字符,您将获得10个数据库调用。但是,我敢肯定,这不是这个问题的问题,我不想在解决无关问题的长篇文章中陷入困境。
基本问题和解决方案
因此,从给定的代码和细节数量中,我可以肯定地说(99.95%(,导致内存异常的代码必须来自MySQL调用。由于您不提供用于MySQL的库/DLL/参考
引起同样问题的mysql驱动程序的一个示例是在这里ASP.NET尝试读取或写下受保护的内存。这通常表明其他内存已损坏。
如果您还没有,我建议您使用的是,希望解决您的问题,是此版本的已维护库,用于与MySQL https://www.nuget.org/packages/packages/mysql.data/
如果您仍然遇到问题,并且正在使用该问题,我将开始怀疑数据库本身或网络间歇性并导致错误。
一个重要的注释是,您应该在Visual Studio中启用所有错误捕获的错误,因此请按 ctrl alt e 并选中每个框。然后,当您遇到此错误时,应该将您直接进入其失败的代码确切行,我们可以进一步研究