2012-09-11 3 views
0

MySQL 데이터베이스 연결을 사용하는 C# 프로그램에서이 이상한 AccessViolationException이 발생합니다. 필자는 데이터베이스의 값을 사용하여 텍스트 상자에 대한 자동 고침 기능을 생성합니다. 여기 코드는 다음과 같습니다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에서 구현됩니다

실제 쿼리에 getValues라는 동일한 파일에 별도의 방법으로 이루어집니다
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; 
    } 

:

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 } 
+1

예외가 던져지는 정확한 위치 (코드의 어느 줄)를 게시하십시오 ... – wasyl

+0

나는 MySqlDataReader를 사용한 적이 없지만 SQL과 ODBC를 사용했습니다. 나는 당신의 문제가 list [i] .Add (dataReader [columnNames [i]] + "")에 상당히 긍정적이라고 생각합니다. 문자열을 사용하여 항목을 검색하면 datareader는 결과를 Object로 반환합니다. 추가하기 전에 Object를 string으로 변환하거나 적절한 해당 열 유형으로 변환해야 할 수 있습니다. – Josh

+0

수 없습니다. 이 getValue() 메서드를 통해 내 프로그램 전체에서 데이터를 검색하는 제네릭 메서드로 사용합니다. 이 텍스트 상자에 문자가 입력 된 경우를 제외하고는이 문제가 발생하지 않습니다. 어쨌든 고마워. – PPGoodMan

답변

0

DataGridView 자동 완성 기능을 사용하고있을 때 비슷한 문제가있었습니다. 마지막으로, 이상한 문제 '액세스 위반 읽기 위치 0x00000000'은 null 문자열을 AutoCompleteStringCollection에 추가하면이 예외의 원인이되는 .net의 작은 세미 버그로 인한 것임을 발견했습니다!

데이터베이스에서와 같이 소스에서 자동 완성 데이터를로드 할 때 중요한 것은 모음에 데이터를 추가 할 때 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; 
} 
0

의 SelectedIndexChanged 이벤트 기간 동안 수집 :

편집 다음과 같은 코드가 (: if (names[0][i]!=null) ... 조건 경우가 있습니다). 스택 추적은 관리되지 않는 코드이지만 ComboBox.items 컬렉션을 편집하는 것은 확실히 원인이었습니다. AutocompleteSource 항목을 편집하면 "추천"모드가 ComboBox처럼 작동하기 때문에 문제가 원인 일 수 있습니다.

관련 문제