查询数据库时尝试读取或写入受保护的内存

时间:2018-04-05 12:29:08

标签: c#

我收到此错误:

  

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

运行此代码时:

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();
}

有时可以运行,但它经常显示此错误。我该如何解决?

1 个答案:

答案 0 :(得分:0)

代码问题

我在代码中可以识别的唯一问题(因为缺少某些信息)是每次键入字符时,都会进行数据库查询并在同一个线程上执行此操作(UI如果查询需要2秒才能完成,那么键入每个字符需要2秒才能输入。对用户来说非常糟糕的经历。

对于MySQL语句本身,它没有任何内在错误,尽管我确实认为这是你问题的原因。

修复UI线程

首先我想说明为什么你有线程问题你应该先了解线程。我在这里制作了一个视频https://www.youtube.com/watch?v=XXg9g56FS0khttps://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 并选中每个框。然后,当您收到此错误时,它应该直接转到它失败的确切代码行,我们可以进一步调查