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 }