我在使用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 }
答案 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)。