2010-05-26 5 views
9

Chicos, estoy luchando. Tengo una consulta en mi base de datos que devuelve una sola columna de datos y debo configurarla como Lista. Aquí es con lo que estoy trabajando y me aparece un error al convertir void en cadena.C# sqlite resultados de la búsqueda a la lista <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(); 
     } 
    } 
} 

luego en LA APLICACIÓN

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

¿Por qué crea repetidamente objetos 'List ' vacíos? –

+0

hombre, ojalá lo supiera .. estoy perdido. Necesito que el resultado de esa consulta esté en una lista a la que pueda hacer referencia en la segunda parte del código que publiqué. –

+0

@jakesankey Ok, para darle un empujón en la dirección correcta, solo quiere crear la nueva 'Lista ()' una vez, luego hacer 'List.Add' para cada nombre que vuelva a leer, luego, por supuesto, en el fin del método, desea devolver su lista. –

Respuesta

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

cosas que he modificado en el código:

  • Deja ImportedFiles en el volumen de todo el método.
  • No es necesario llamar a connect.Close(); ya que el objeto de conexión está envuelto en un bloque en uso.
  • Use Convert.ToString en lugar de (String) ya que el primero manejará todas las conversiones de tipo de datos a la cadena. Me encontré con este Here

Editar:

estuviera creando un nuevo objeto de comando sqlComm en lugar de utilizar fmd que fue creado por el objeto de conexión.

+0

Gracias ... Recibo el mismo error que me dio el código siguiente ... "Bien, este código me ha llevado un poco más allá. He pasado el primer error, pero apunta a SQLiteDataReader r = sqlComm.ExecuteReader(); línea y dice que no hay conexión asociada con él ?? –

+0

Reparado. El código de Nikos ya ha abordado el problema. – Bablo

+0

AGRADABLE! Trabajando como un encanto. ¡Gracias por acompañarme! –

0

El error es sobre el tipo de retorno de su método. Estás volviendo vacío (public staticvoid) pero luego úsalo más tarde como si devolviera un List<string>.

creo que usted pensó el siguiente método de firma:

public static List<string> GetImportedFileList() 
0

Ya tiene una manera de conseguir los resultados individuales, por lo que me parece que sólo tiene que:

Mover el List<string> ImportedFiles = new List<string>(); fuera el lazo while.

Llamada ImportedFiles.Add(FileNames); dentro del bucle (después de que se asigna esa cadena).

return ImportedFiles al final.

Cambie el tipo de devolución a List<string>.

+0

Entonces, en la segunda parte de mi código de ejemplo, ¿cómo obtengo esa lista para la declaración foreach? –

3

En primer lugar, su tipo de devolución está anulada. Debes devolver una lista. Otro problema es que inicializas la lista dentro del ciclo, por lo que en cada paso del ciclo tienes una nueva lista, y además, no agregas la cadena en la lista. El código debe ser probablemente más como:

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, este código me llevó un poco más allá. He pasado ese primer error, pero apunta a SQLiteDataReader r = sqlComm.ExecuteReader(); línea y dice que no hay conexión con él? –

+0

@jakesankey Edité el código, y debería funcionar ahora. El problema era que estaba usando SQLiteCommands y no asoció la conexión al comando que ejecuta el lector. –

Cuestiones relacionadas