2010-05-26 9 views
9

Faceci, walczę. Mam zapytanie przeciwko mojej db, która zwraca pojedynczą kolumnę danych i muszę ustawić ją jako List. Oto, z czym pracuję i pojawia się błąd związany z konwersją void na string.C# wyniki kwerendy sqlite do listy <string>

public static void GetImportedFileList() 
    { 
     using (SQLiteConnection connect = new SQLiteConnection(@"Data Source=C:\Documents and Settings\js91162\Desktop\CMMData.db3")) 
     { 
      connect.Open(); 
      using (SQLiteCommand fmd = connect.CreateCommand()) 
      { 
       SQLiteCommand sqlComm = new SQLiteCommand(@"SELECT DISTINCT FileName FROM Import"); 
       SQLiteDataReader r = sqlComm.ExecuteReader(); 
       while (r.Read()) 
       { 
        string FileNames = (string)r["FileName"]; 

        List<string> ImportedFiles = new List<string>();       
       }      

       connect.Close(); 
     } 
    } 
} 

to później w ciągu STOSOWANIA

List<string> ImportedFiles = GetImportedFileList() // Method that gets the list of files from the db 
foreach (string file in files.Where(fl => !ImportedFiles.Contains(fl))) 
+0

Dlaczego ciągle tworzysz puste obiekty 'List '? –

+0

Człowieku, chciałbym wiedzieć .. jestem zagubiony. Potrzebuję zwrotu tego zapytania, aby znaleźć się na liście, do której mogę się odnieść w drugiej części opublikowanego przeze mnie kodu. –

+0

@jakesankey OK, aby dać ci push we właściwym kierunku, chcesz tylko utworzyć nową 'List ()' raz, następnie wykonaj 'List.Add' dla każdej nazwy, którą odtworzysz, a następnie oczywiście na koniec metody, chcesz zwrócić swoją listę. –

Odpowiedz

20
public static List<string> GetImportedFileList(){ 
    List<string> ImportedFiles = new List<string>(); 
    using (SQLiteConnection connect = new SQLiteConnection(@"Data Source=C:\Documents and Settings\js91162\Desktop\CMMData.db3")){ 
     connect.Open(); 
     using (SQLiteCommand fmd = connect.CreateCommand()){ 
      fmd.CommandText = @"SELECT DISTINCT FileName FROM Import"; 
      fmd.CommandType = CommandType.Text; 
      SQLiteDataReader r = fmd.ExecuteReader(); 
      while (r.Read()){ 
       ImportedFiles.Add(Convert.ToString(r["FileName"])); 
      } 
     } 
    } 
    return ImportedFiles; 
} 

rzeczy, jakie wprowadza w kodzie:

  • Put ImportedFiles w zakresie całej metody.
  • Nie trzeba dzwonić pod numer connect.Close();, ponieważ obiekt połączenia jest zawijany w blok przy użyciu.
  • Użyj Convert.ToString, a następnie (String), jako że pierwsza będzie obsługiwać wszystkie konwersje typów danych do łańcucha. Natknąłem się na ten Here

EDIT:

podczas tworzenia nowego obiektu polecenia sqlComm zamiast korzystania fmd, który został utworzony przez obiekt połączenia.

+0

Dzięki .. Otrzymuję ten sam błąd, co kod podany mi dał .... "Ok, więc ten kod dostał mnie trochę dalej.Mam przekazać ten pierwszy błąd, ale wskazuje na SQLiteDataReader r = sqlComm.ExecuteReader(); linia i mówi, że nie ma powiązania z nim związanego? " –

+0

Naprawiono. Kod Nikos już rozwiązał problem. – Bablo

+0

ŁADNE! Działa jak urok. Dzięki, że mnie opatrzyłeś! –

0

Błąd jest o typie zwrotnym swojej metody. Zwracasz pustkę (public staticvoid), ale później użyj jej tak, jakby zwracała numer List<string>.

myślę, że planowana metoda następujący podpis:

public static List<string> GetImportedFileList() 
0

masz już sposób, aby uzyskać indywidualne wyniki, więc dla mnie to wygląda po prostu trzeba:

Przesuń List<string> ImportedFiles = new List<string>(); zewnątrz pętla while.

Zadzwoń pod ImportedFiles.Add(FileNames); wewnątrz pętli (po przypisaniu tego ciągu).

return ImportedFiles na końcu.

Zmień typ zwrotu na List<string>.

+0

Tak więc w drugiej części mojego kodu przykładowego, w jaki sposób następnie uzyskać tę listę dla instrukcji foreach? –

3

Przede wszystkim Twój typ zwrotu jest nieważny. Musisz zwrócić listę. Innym problemem jest inicjalizacja listy wewnątrz pętli, więc w każdym przejściu pętli masz nową listę, a co więcej, nie dodajesz ciągu na liście. Kod powinien chyba być bardziej jak:

public static List<string> GetImportedFileList() 
    { 
     List<string> ImportedFiles = new List<string>();       
     using (SQLiteConnection connect = new SQLiteConnection(@"Data Source=C:\Documents and Settings\js91162\Desktop\CMMData.db3")) 
     { 
      connect.Open(); 
      using (SQLiteCommand fmd = connect.CreateCommand()) 
      { 
       fmd.CommandText = @"SELECT DISTINCT FileName FROM Import"; 
       SQLiteDataReader r = fmd.ExecuteReader(); 
       while (r.Read()) 
       { 
        string FileNames = (string)r["FileName"]; 

        ImportedFiles.Add(FileNames); 
       }      

       connect.Close(); 
     } 
    } 
    return ImportedFiles; 
} 
+0

OK, więc ten kod dał mi trochę więcej. Został mi przekazany ten pierwszy błąd, ale wskazuje on na SQLiteDataReader r = sqlComm.ExecuteReader(); linia i mówi, że nie ma powiązania z nim związanego? –

+0

@jakesankey Edytowałem kod i powinien działać teraz. Problem polegał na tym, że korzystałeś z SQLiteCommands i nie skojarzyłeś połączenia z poleceniem uruchamiającym czytnik. –

Powiązane problemy