SQLite3 Упрощенный доступ

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
Alex2013
долгожитель
Сообщения: 3234
Зарегистрирован: 03.04.2013 11:59:44

SQLite3 Упрощенный доступ

Сообщение Alex2013 »

Задача: на произвольный SQL запрос получить не мене произвольный ответ в виде текста ...
Нужно что-то вроде такого кода :
WSForm.SQLite3Connection1.DatabaseName:=N;

...
WSForm.SQLite3Connection1.ExecuteDirect(Par);

...
Rez:= WSForm.SQLite3Connection1. (??)

Во всех примерах , что я нашел используется всяческая визуальная обвязка и встроенный парсинг результатов , которые мне не нужны ...
Последний раз редактировалось Alex2013 28.01.2016 15:36:00, всего редактировалось 1 раз.
Kitayets
постоялец
Сообщения: 174
Зарегистрирован: 05.05.2010 21:15:24

Сообщение Kitayets »

а если тебе на

Код: Выделить всё

SELECT * FROM TABLE;
миллиард записей с БЛОБ-ами приедет, тоже тебе произвольной строкой/текстом это отдать?

ИМХО никто такие бредовые задачи не решает при работе с базами данных. Общеупотребительные компоненты направленны на "более не менее" стандартный паттерн использования.
Alex2013
долгожитель
Сообщения: 3234
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Уфф ! "Товарищ не понимает " :D
Еще раз ...

1. База локальная простейшая
2. Запросы я худо бедно писать умею и (о ужос! :wink: ) знаю как просить чтобы на выходе было именно то количество строк что мне нужно...
3. С базой пока работаю вызывая консольную утилиту SQLite3.exe ...
4. Все что мне надо от SQLite УЖЕ работает. (и транслируется в Веб-интерфейс )

Я просто не разобрался с библиотекой продержки SQLite в Лазарусе .
( элементарно не понял как получить полный ответ на запрос по аналогии с консольной версией .)
То есть конкретно не понял какое поле класса SQLite3Connection сдержит полный текст ответа на произвольный запрос .
(Его ведь просто не может не быть )
Зы
Если нетрудно, пожалуйста, кинете пример (там же как понимаю буквально пара строчек кода )
Зы Зы
О существовании .FieldByName( ) знаю, но как получить ответ если заранее не ясно что за поле будет нужно ?
Зы Зы Зы
Накопал массив
SQLQuery3.Fields[..] Это вроде то что надо ?
pupsik
энтузиаст
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13
Контактная информация:

Сообщение pupsik »

http://wiki.freepascal.org/SQLdb_Tutorial1
SQLite3Connection - это способ доступа (если можно так назвать). А SQLQuery - способ работы с бд.
По идее ваш вопрос странен.
В лазаре есть еще один дополнительный компонент. Он может работать в "две стороны".

.FieldByName( ) знаю, но как получить ответ если заранее не ясно что за поле будет нужно ?
А что сложного. БЕрем список полей и проганяем в цикле.

п.с.
Хотя: можно узнать кол-во таблиц, схему и узнать какие поля "привинчены" в таблицу. Все что есть в public -е датасета. А вот работать с таблицей только через SQLQuery. Или использовать компоненты с "прямым" доступом (обертки всякие).
Аватара пользователя
Снег Север
долгожитель
Сообщения: 3071
Зарегистрирован: 27.11.2007 15:14:47
Контактная информация:

Сообщение Снег Север »

Alex2013 писал(а):SQLQuery3.Fields[..] Это вроде то что надо ?

Если вы не знаете названий полей, то да, то что вам надо. Но что вам мешает читать служебную информацию базы SQLite, где есть все описания, мне непонятно.
Alex2013
долгожитель
Сообщения: 3234
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Что ж спасибо за ответы ...
Пока буду пробовать то что уже нарыл .
(Понимаю что вопрос был из области "тупых" ( на который подмывает ответить "гугл в помощь" и RTFM) :mrgreen: но думал что кто-то просто знает готовое решение ... )

Добавлено спустя 19 часов 59 минут 10 секунд:
В общем родил я вот такой код ( и что удивительно он даже работает! ) :D
Результат понятное дело возвращает в Result

Код: Выделить всё

          With WSForm do begin 
           //SQLiteLibraryName:='sqlite3.dll';
           SQLite3Connection1.DatabaseName:=N; // Имя файла БД
           SQLite3Connection1.open;
           SQLTransaction1.DataBase:= SQLite3Connection1;
           SQLQuery1.Database:= SQLite3Connection1;
           SQLQuery1.Transaction:=SQLTransaction1;
           SQLite3Connection1.Connected := True;
           SQLQuery1.SQL.Text:=PAR;  // PAR  произвольный SQL запрос ...
           SQLTransaction1.StartTransaction;
           SQLQuery1.Open;

           Result :='';
           while not  SQLQuery1.Eof do
            begin
             For  J:=0 to SQLQuery1.Fields.Count-1 do
              begin
               if J >0 then  Result := Result+'|';
               Result := Result+SQLQuery1.Fields[J].AsString;
              end;
             Result := Result+#13+#10;
             SQLQuery1.Next;
            end;
           SQLQuery1.Close ;
           SQLTransaction1.Commit;
           SQLite3Connection1.Close ;
           exit;
          end
         end;                             
 

Вопросы:
1 Не заложил ли я где-то по не знанию какой нибудь "логической бомбы " ?
2 Можно ли это чудище упростить ?
Зы
На вопрос "зачем все это " ?
Ответ простой "Чтобы не менять логику уже готовой надстройки " ( и кроме того у меня логика работы с произвольной БД может быть реализована в скрипте, который будет правится без необходимости менять исходники веб-сервера, а значит нельзя всегда исходить из посылки, что формат запросов и результатов будет постоянным .)
Последний раз редактировалось Alex2013 18.02.2016 16:30:14, всего редактировалось 1 раз.
Alex2013
долгожитель
Сообщения: 3234
Зарегистрирован: 03.04.2013 11:59:44

Сообщение Alex2013 »

Для комплекта ...
Простой код для запросов на изменение БД
(То есть DELETE INSERT UPDATE CREATE... Обрабатывает по одному запросу за один раз... сложно составные запросы разделенные через "; " неподерживает )

Предыдущий код работает только с SELECT ( Кстати, интересно почему ? )

Код: Выделить всё

  
         // SQLiteLibraryName:='sqlite3.dll';

            SQLQuery1.Database:= SQLite3Connection1;
            SQLQuery1.Transaction:=SQLTransaction1;
            SQLTransaction1.DataBase:= SQLite3Connection1;
         
            SQLite3Connection1.DatabaseName:=N; // Имя файла БД
            SQLite3Connection1.open;
            SQLTransaction1.Active:=True;
            SQLite3Connection1.ExecuteDirect(Par); // Запрос в PAR

            SQLTransaction1.Commit;
            SQLite3Connection1.Close ;
Ответить