Форум программистов, компьютерный форум, киберфорум
C++ Builder: Базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.90/88: Рейтинг темы: голосов - 88, средняя оценка - 4.90
3 / 3 / 0
Регистрация: 03.10.2018
Сообщений: 249

SqLite первые шаги

03.02.2024, 20:40. Показов 31873. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В моем проекте до сих пор куча массивов, решил заменить базой SQlite, но на первом же примере затормозил.
Пример взят отсюда: https://docwiki.embarcadero.co... pplication
При нажатии кнопки Connect в Мемо ничего не появляется, и через пару секунд окно само закрывается, вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void __fastcall TForm1::connectButtonClick(TObject* Sender)
{
    // Use double backslash in Windows Paths as the backslash character (\) must be escaped with another one to be treated literally.
    SQLConnection1->Params->Add(
        "D:\\Employees.s3db");
    try {
        // Establish the connection.
        SQLConnection1->Connected = true;
        executeButton->Enabled = true;
        //   connectButton->Enabled = true;
 
        outputMemo->Text = "Connection established!";
    } catch (EDatabaseError &E) {
        ShowMessage("Exception raised with message" + E.Message);
    }
}
База с таким именем существует, библиотеку sqlite3.dll закинул в C:\Windows\SysWOW64, хотя есть там она или нет - ничего не меняет, результат тот же.
В чем дело?

У меня Embarcadero® RAD Studio 11 Version 28.0.48361.3236

Добавлено через 12 минут
Может где то путь прописать надо к этой библиотеке?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.02.2024, 20:40
Ответы с готовыми решениями:

Первые шаги...
Скачал себе Borland C++ builder В учебники первая задача создать файл first.cpp Записать в нем следующее: #include...

Mortal Kombat - первые шаги
Здравствуйте. вот решил попробовать написать игру типа Mortal Kombat и заодно выяснить, можно ли с помощью стандартной библиотеки...

Создание своего компонента, первые шаги
Пробую создать свой невизуальный компонент, наследник от TComponent. Задачи компонент решает очень простые, посредством метода, в котором...

29
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,498
Записей в блоге: 3
06.02.2024, 17:41
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от TrollHammer Посмотреть сообщение
но в SQLite-е строки заключаются в одинарные кавычки.
SQLite , насколько мне мой склероз не изменяет, это, в общем-то, без разницы, главное, чтобы они одинаковые были
Цитата Сообщение от TrollHammer Посмотреть сообщение
FDQuery->Active = true;
Для неселективных запросов это просто не имеет смысла: установка свойства Active в true - это то же самое, что выполнить метод Open() - открыть возвращаемый запросом набор данных и позиционироваться на первую запись этого набора. В случае же запроса, выполняющего действие, возвращаемого набора данных просто нет, нечего открывать.
Цитата Сообщение от Belju Посмотреть сообщение
query->DisposeOf();
Бог мой! Они там вообще справку обновляют? Эта деректива была устаревшей еще в прошлом тысячелетии! Чтобы не быть голословным:



но, поскольку Free() в С++ не используется



заменяем ее на дерективу delete
0
3 / 3 / 0
Регистрация: 03.10.2018
Сообщений: 249
06.02.2024, 21:09  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Для неселективных запросов это просто не имеет смысла: установка свойства Active в true - это то же самое, что выполнить метод Open() - открыть возвращаемый запросом набор данных и позиционироваться на первую запись этого набора.
Действительно, наличие строки FDQuery->Active = true при выполнении всякий раз выскакивает окно предупреждения, хотя все работает как надо, поэтому лучше ее удалить.

Есть ли какая функция для копирования массива в базу, а еще лучше структуры массивов? Или это делается обычным перебором в цикле?
0
 Аватар для TrollHammer
1216 / 709 / 336
Регистрация: 22.02.2018
Сообщений: 2,095
Записей в блоге: 2
07.02.2024, 08:41

Не по теме:

Цитата Сообщение от D1973 Посмотреть сообщение
Для неселективных запросов это просто не имеет смысла:
Это просто у меня тянется с незапамятных времен, была какая-то ошибка Query, лечилась таким образом. Может уже это и не надо, но привычка...



Добавлено через 4 минуты
Цитата Сообщение от Belju Посмотреть сообщение
Есть ли какая функция для копирования массива в базу
Если массивы создаются в программе, то циклом. Если из внешнего файла, то запросом в БД.
0
3 / 3 / 0
Регистрация: 03.10.2018
Сообщений: 249
07.02.2024, 16:11  [ТС]
Снова затормозил, как добавить запись если такой вид:
C++
1
2
3
AnsiString a1 =  "Foreget";
// query->SQL->Text = "INSERT INTO Holdem (Name) VALUES (\"Foreget\")";  // ОК
query->SQL->Text = "INSERT INTO Holdem (Name) VALUES (a1)";  //    нужно по другому
0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,498
Записей в блоге: 3
07.02.2024, 18:29
Цитата Сообщение от Belju Посмотреть сообщение
//    нужно по другому
еще бы. Но это уже как бы не относится непосредственно к работе с БД, это элементарнейшие операции с строками.
Тупо как молоток - простейшая конкатенация:
C++
1
query->SQL->Text = "INSERT INTO Holdem (Name) VALUES (" + a1 + ")";
Через строку форматирования:
C++
1
query->SQL->Text = String().sprintf(L"INSERT INTO Holdem (Name) VALUES (%s)", QuotedStr(a1));
Праметрический запрос. Путь самый грамотный, но, на мой взгляд, зачастую несколько избыточный и ненаглядный, хотя, в принципе, эта "избыточность" лихвой окупается в сложных запросах.
C++
1
2
query->SQL->Text = "INSERT INTO Holdem (Name) VALUES (:a1)";
query->Params->ParamByName("a1")->AsString = a1;
1
3 / 3 / 0
Регистрация: 03.10.2018
Сообщений: 249
07.02.2024, 19:32  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
это элементарнейшие операции с строками.
По разному пробовал, но до такого не дошел, спасибо.
Есть ли разница в скорости обработки запроса? Массивы больше 100к элементов
0
Модератор
 Аватар для D1973
9954 / 6490 / 2461
Регистрация: 21.01.2014
Сообщений: 27,498
Записей в блоге: 3
08.02.2024, 07:21
Цитата Сообщение от Belju Посмотреть сообщение
Массивы больше 100к элементов
Не уверен, что движок FireDAC прожует 100К подряд идущих Инсертов в запросе. Есть 2 пути:
1. Если это разовая процетура - оформить свой массив в виде файла *.CSV и уже этот файл спокойно импортировать в таблицу средствами самой СУБД, не привдекая никаких прослоек в виде C++ Builder-а с его FireDAC-ом
2. Если же такое надо делать регулярно - я бы советовал пересмотреть алгоритм работы. Не может 100К данных взяться единомоментно из ниоткуда: вот и писать эти данные в базу по мере их поступления, а не тогда, когда их уже 100500...
0
3 / 3 / 0
Регистрация: 03.10.2018
Сообщений: 249
08.02.2024, 13:05  [ТС]
Цитата Сообщение от D1973 Посмотреть сообщение
Если же такое надо делать регулярно - я бы советовал пересмотреть алгоритм работы.
Это нужно сделать единожды, причем есть два пути, первый это готовую структуру из 15 массивов перенести в базу, второй - по новой парсить файлы, а их около 5к и около 5 млн строк, и заполнить базу. Для парсинга всех файлов в структуру массивов уходит около 15 минут на компе с Ryzen 7 7700X и около 40мин на ноуте с Ryzen 7 4700U. Потом уже база будет пополняться по мере появления файлов.
Попробую оба способа заполнить базу и потом сюда отпишусь
0
3 / 3 / 0
Регистрация: 03.10.2018
Сообщений: 249
08.02.2024, 22:24  [ТС]
Пробная запись в базу только имен парсингом прошла успешно за 4,5 минуты. С числом записей я ошибся, их чуть меньше 20к, но со временем будет и больше 100к, а файлов и строк столько же как писал выше, и почему то на две записи больше чем в массиве, хотя с массивами может где какая то неточность в коде. Стоит добавить что бэкап файлов хранится на домашнем сервере, а не на ССД компа.
Скрин не получилось в спойлер вставить.
Код такой:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
for (int w = 0; w < u; w++) {
 .......................................................
........................................................
                                string s = st.substr(0, y - 1);
                                PlayName = s.c_str();
                             query->Connection = FDConnection1;
                            try {
                                query->SQL->Text =
                                    "INSERT INTO Holdem (Name) VALUES (:PlayName)";
                                query->Params->ParamByName("PlayName")
                                    ->AsString = PlayName;
                                query->ExecSQL();
                            } catch (Exception &E) {
                                continue;
                            }
}
Может если бы запрос был короче, то и время ушло бы меньше, но два других примера запросов, подсказанные D1973 у меня не работают.
C++
1
2
3
        AnsiString a1 = "Foreget";
    query->SQL->Text = "INSERT INTO Holdem (Name) VALUES (" + a1 + ")";
        query->SQL->Text = String().sprintf(L"INSERT INTO Holdem (Name) VALUES (%s)", QuotedStr(a1));
Первый нет такого поля
Второй [bcc64 Error] Write_card.cpp(1427): cannot pass object of non-trivial type 'System::UnicodeString' through variadic method; call will abort at runtime

Есть вопросы по запросам)), но не хочу пока никого напрягать
0
3 / 3 / 0
Регистрация: 03.10.2018
Сообщений: 249
09.02.2024, 22:25  [ТС]
Итого имеем окончательный результат:
Парсинг текста, 5к файлов с 5М строк, с сохранение данных в структуру из 21 массива(в каждом 20к элементов), и запись структуры в бинарный файл уходит 15мин 14сек
То же самое сохранение в базе данных потрачено 5мин 52сек
Вывод очевиден, + наглядность и доступ к данным
Тема закрыта! Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.02.2024, 22:25

Первые шаги с ATMEGA8-16PU, и первые ссадины
Всем привет! Собрал свою первую схему на макетной плате с ATMEGA8-16PU. В схеме имеется два резистора на 300ом, и два светодиода. В Atmel...

C++ первые шаги (абсолютно первые)
Привет, пользователи CyberForum. Я относительно давний юзер этого форума, и вот, наконец-то решил воплощать мечту в реальность, а именно...

Первые шаги.
Здравствуйте. Извините, может, за тупые вопросы. Но с языком С впервые сталкиваюсь. Использую среду прогр-я C-Free Standard 4.0. Открыл...

Первые шаги
Я только собираюсь начать изучать фреймворки, подскажите, пожалуйста, какой выбрать, с чего начать, что почитать.... Заранее спасисбо!

Первые шаги
Здраствуйте, меня зовут Женя, мне 16 лет. Я решил научиться программировать. Юзал поиск и в конце концов, накачав достаточно литературы и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
30
Ответ Создать тему
Новые блоги и статьи
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru