#sql #sqlite #qt #csv #import
#sql #sqlite #qt #csv #импорт
Вопрос:
Я могу заставить свое приложение загружать 3 .csv-файла с защищенного FTP с помощью примера загрузки Qt Network, создать локальную базу данных Sqlite вместе с 3 таблицами, которые в конечном итоге будут содержать информацию, содержащуюся в файлах csv.
Следующее взято из публикации в блоге об импорте csv-файлов в Qt, и инструкции вставки вывода кажутся правильными, но данные, похоже, не попадают в таблицу.
void speciesinformation::populateTable()
{
QFile f("species_list_dos_utf8.csv");
if(f.open (QIODevice::ReadOnly| QIODevice::Text)){
QSqlQuery que;
QTextStream ts (amp;f);
//Travel through the csv file
while(!ts.atEnd()){
QString req = "INSERT INTO species_list VALUES (";
// split every line
QStringList line = ts.readLine().split('n');
/*for every values on a line,
append it to the INSERT request*/
for(int i=0; i<line .length (); i){
req.append(line.at(i));
req.append(",");
}
req.chop(1); // remove the trailing comma
req.append(");"); // close the "VALUES([...]" with a ");"
que.exec(req);
qDebug() << req;
}
}
}
и вывод гласит:
«ВСТАВИТЬ В ЗНАЧЕНИЯ species_list (Многолетний черноплодник, Сложноцветные, Астра, Сончус, 361, Растения, арвенсис, Травы);» «ВСТАВИТЬ В ЗНАЧЕНИЯ species_list (Колючая олива, элеутерококк, Олеастр, Элеагнус, 363, Растения, остролистные, Кустарники); » … и т. д
Когда я открываю DBBrowser (Sqlite), чтобы просмотреть базу данных, в таблице species_list ничего не появляется. У меня есть создание базы данных и создание таблицы в отдельных функциях в моем .cpp.
У меня есть другая тестовая функция (ниже), но я получаю сообщение об ошибке QSqlQuery::value: не помещено в допустимую запись.
void speciesinformation::populateSpeciesTable()
{
//open file
QFile fspecies("species_list_dos_utf8.csv");
if (!fspecies.open(QIODevice::ReadOnly)) {
qDebug() << fspecies.errorString();
}
QStringList wordList;
while (!fspecies.atEnd()) {
QByteArray fields = fspecies.readAll();
wordList.append(fields.split(',').first());
}
qDebug() << wordList;
QSqlQuery popSpecies;
popSpecies.prepare("INSERT INTO species_list(cname, family, fdetail, genus, id, kingdom, species, habit) values(:one, :two, :three, :four, :five, :six, :seven, :eight)");
popSpecies.bindValue(":one",popSpecies.value(0).toChar());
popSpecies.bindValue(":two",popSpecies.value(1).toChar());
popSpecies.bindValue(":three",popSpecies.value(2).toChar());
popSpecies.bindValue(":four",popSpecies.value(3).toChar());
popSpecies.bindValue(":five",popSpecies.value(4).toChar());
popSpecies.bindValue(":six",popSpecies.value(5).toChar());
popSpecies.bindValue(":seven",popSpecies.value(6).toChar());
popSpecies.bindValue(":eight",popSpecies.value(7).toChar());
if(!popSpecies.exec())
{
qDebug()<< popSpecies.lastError().text();
}
}
Я прочитал документацию Qt и другие форумы, но, похоже, я не могу скопировать данные из файлов csv в таблицы Sqlite. Любые примеры или помощь будут высоко оценены.
Комментарии:
1. Какую ошибку вы получаете от запроса в первой части кода? .. когда вы это делаете
INSERT INTO species_list VALUES( ..)
.. вы уверены, что вставляете значения для всех столбцов? ошибка во второй части кода заключается в том, что вы привязываетесь к запросу из результата запроса ?!popSpecies.value(0)
не должен отображаться в привязке запроса.. может быть, вы хотите что-то вродеpopSpecies.bindValue(":one",wordList.at(0).toChar());
2. Привет, Мохаммад, спасибо за ваш ответ. В первой части я не получаю никаких сообщений об ошибках в выходных данных приложения — в нем просто перечислены все операторы insert для каждой строки.
3. Мохаммад, я просто хочу сказать, что ваш комментарий о разделе bindValue мне очень помог! В итоге я сосредоточился на том разделе, на который пытался его изменить,
popSpecies.bindValue(":one",wordList.at(0).toChar());
но получал сообщение об ошибке, поэтому я изменил его на этотpopSpecies.bindValue(":one",wordList.value(0).toUtf8());
, и он действительно помещает «cname» в мою таблицу базы данных! Похоже, что что-то может быть не так со списком слов, потому что, похоже, он считывает только слово «cname» из файла (которое является первым словом, которое появляется в файле).4. Для первой части вам нужно явно проверить ошибку после выполнения запроса ..
lastError()
должен сказать, что пошло не так!5. Понял — спасибо! Я опубликую комментарий здесь, если столкнусь с проблемой с ошибкой. Я, конечно, ценю ваше время.