AccessViolationException?

时间:2012-09-11 18:40:29

标签: c# mysql access-violation

我在使用MySQL数据库连接的C#程序中得到了这个奇怪的AccessViolationException。我使用数据库中的值为文本框生成自动更正工具。这是代码片段:

private void textBoxName_TextChanged(object sender, EventArgs e)
    {

            AutoCompleteStringCollection asc = Database.getSuggestedNames(textBoxName.Text);
            if (asc != null)
                textBoxName.AutoCompleteCustomSource = asc;                         
    }

getSuggestedNames(string)方法在Database.cs中实现,如下所示:

public static AutoCompleteStringCollection getSuggestedNames(string namepart)
    {
        string query = "SELECT name FROM worker WHERE name LIKE '%"+namepart+"%';";
        string[] namecolumn = { "name" };
        List<string>[] names = getValues(query,namecolumn);
        AutoCompleteStringCollection namec = new AutoCompleteStringCollection();
        for (int i = 0; i < names[0].Count; i++)
            namec.Add(names[0][i]);
        return namec;
    }

实际查询是在名为getValues的同一文件中使用单独的方法完成的:

private static List<string>[] getValues(string query,string[] columnNames)
    {
        if (connection == null)
            initialize();

        if (connection.State == ConnectionState.Closed)
            connection.Open();

        MySqlCommand cmd = new MySqlCommand(query, connection);
        MySqlDataReader dataReader = cmd.ExecuteReader();
        List<string>[] list = new List<string>[columnNames.Length];

        for (int i = 0; i < columnNames.Length; i++)
            list[i] = new List<string>();

        while (dataReader.Read())
        {
            for(int i=0;i<columnNames.Length;i++)
                list[i].Add(dataReader[columnNames[i]] + "");
        }

        dataReader.Close();
        connection.Close();
        return list;
    }

当用户在文本框textBoxName中输入数据时,总会发生异常。错误不是很频繁,调用堆栈显示导致问题的外部代码。所以我认为它应该是导致问题的MySQL。

有人可以帮我解决这个问题,因为我无能为力。

错误发生的确切行是以下代码中的第17行,这对我来说没什么用于调试。 Visual Studio不显示任何其他位置。堆栈跟踪显示[外部代码]。但无论如何它在这里:

1    using System;
2    using System.Collections.Generic;
3    using System.Windows.Forms;
4    
5    namespace LabourManagement
6    {
7        static class ManagementProgram
8        {
9            /// <summary>
10            /// The main entry point for the application.
11            /// </summary>
12            [STAThread]
13            static void Main()
14            {
15                Application.EnableVisualStyles();
16                Application.SetCompatibleTextRenderingDefault(false);
17                Application.Run(new General());
18                         
19            }
20        }
21    }

2 个答案:

答案 0 :(得分:0)

当我处理DataGridView自动完成功能时,我遇到了类似的问题。最后,我发现奇怪的问题'访问冲突读取位置0x00000000'是由于.net中的一个小的半错误,如果你向AutoCompleteStringCollection添加null字符串会导致此异常!

因此,从数据库等数据库加载自动完成数据时,重要的是确保在向集合中添加数据时避免/跳过null项。

按如下方式编辑代码(请注意if条件:if (names[0][i]!=null) ...):

public static AutoCompleteStringCollection getSuggestedNames(string namepart)
{
    string query = "SELECT name FROM worker WHERE name LIKE '%"+namepart+"%';";
    string[] namecolumn = { "name" };
    List<string>[] names = getValues(query,namecolumn);
    AutoCompleteStringCollection namec = new AutoCompleteStringCollection();
    for (int i = 0; i < names[0].Count; i++)
        if (names[0][i]!=null) namec.Add(names[0][i]);
    return namec;
}

答案 1 :(得分:0)

我在ComboBox中遇到了同样的问题,我在SelectedIndexChanged事件中编辑了项目收集。堆栈跟踪将是非托管代码,但编辑ComboBox.items集合绝对是罪魁祸首。也许编辑AutocompleteSource项会导致您的问题(因为“建议”模式的工作方式类似于ComboBox)。