查询数据库时,试图读取或写下受保护的内存



我得到此错误:

试图读取或写下受保护的内存。这通常表明其他内存已损坏。

运行此代码时:

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 并选中每个框。然后,当您遇到此错误时,应该将您直接进入其失败的代码确切行,我们可以进一步研究

最新更新