【问题标题】:Attempted to read or write protected memory when querying database查询数据库时尝试读取或写入受保护的内存
【发布时间】:2018-09-15 06:45:49
【问题描述】:

我收到此错误:

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

运行此代码时:

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

有时候运行是可以的,但是经常出现这个错误。我该如何解决?

【问题讨论】:

标签: c#


【解决方案1】:

代码问题

我可以在您提供的代码中识别的唯一问题(因为缺少一些信息)是每次键入字符时,您都会执行数据库查询,并且您在同一个线程(UI已打开),因此如果查询需要 2 秒才能完成,您的输入将需要 2 秒来输入每个字符。用户体验非常糟糕。

对于 MySQL 语句本身,它本身并没有什么问题,尽管我相信这是您的问题的原因。

修复 UI 线程

首先我想说要理解为什么你有线程问题,你应该首先理解线程。我在https://www.youtube.com/watch?v=XXg9g56FS0khttps://www.youtube.com/watch?v=S0jPzb9kk3o 制作了一个视频

在您了解问题后,您应该能够安全地将呼叫转移到另一个线程。但是,您将遇到另一个问题......然后,如果每个调用需要 2 秒并且用户在那段时间内键入 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 并选中每个框。然后,当您收到此错误时,它应该直接将您带到它失败的确切代码行,我们可以进一步调查

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多