C # sqlite результаты запроса к списку <string> - PullRequest
12 голосов
/ 26 мая 2010

Я борюсь. У меня есть запрос к моей базе данных, который возвращает один столбец данных, и мне нужно установить его в виде списка. Вот то, с чем я работаю, и я получаю сообщение об ошибке преобразования void в строку.

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

Затем в приложении

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

Ответы [ 4 ]

26 голосов
/ 26 мая 2010
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;
}

Вещи, которые я исправил в вашем коде:

  • Поместите ImportedFiles в область действия всего метода.
  • Нет необходимости вызывать connect.Close();, так как объект подключения заключен в блок using.
  • Используйте Convert.ToString вместо (String), так как первый будет обрабатывать все преобразования типов данных в строку. Я наткнулся на это Здесь

Edit:

Вы создавали новый объект команды sqlComm вместо использования fmd, созданного объектом подключения.

3 голосов
/ 26 мая 2010

Прежде всего, ваш тип возврата недействителен.Вам необходимо вернуть список.Другая проблема заключается в том, что вы инициализируете список внутри цикла, поэтому при каждом проходе цикла у вас появляется новый список, и, кроме того, вы не добавляете строку в список.Ваш код, вероятно, должен быть больше похож на:

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 голосов
/ 26 мая 2010

У вас уже есть способ получить индивидуальные результаты, поэтому мне кажется, что вам просто нужно:

Переместите List<string> ImportedFiles = new List<string>(); за пределы цикла while.

Вызовите ImportedFiles.Add(FileNames); внутри цикла (после того, как эта строка будет назначена).

return ImportedFiles в конце.

Измените тип возвращаемого значения на List<string>.

0 голосов
/ 26 мая 2010

Ошибка связана с типом возврата вашего метода. Вы возвращаете void (public staticvoid), но затем используете его позже, как если бы он возвращал List<string>.

Я думаю, что вы намеревались подписать следующий метод:

public static List<string> GetImportedFileList()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...