0

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    }
4

2 に答える 2

0

SelectedIndexChanged イベント中に項目収集を編集した ComboBox でも同じ問題がありました。スタック トレースはアンマネージ コードになりますが、間違いなく ComboBox.items コレクションの編集が原因でした。AutocompleteSource 項目の編集が問題を引き起こしている可能性があります (「提案」モードは ComboBox のように機能するため)。

于 2016-09-23T23:18:24.983 に答える
0

DataGridView のオートコンプリート機能に取り組んでいたときに、同様の問題が発生しました。null最後に、AutoCompleteStringCollection に文字列を追加すると、この例外が発生する .net の小さなセミバグが原因で、奇妙な問題「アクセス違反の読み取り場所 0x00000000」が発生することを発見しました。

したがって、データベースなどのソースからオート コンプリート データをロードする場合に重要なことは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;
}
于 2013-12-08T08:26:54.000 に答える