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

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

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

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

Сообщение Alex2013 » 26.01.2016 15:43:56

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

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

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

Во всех примерах , что я нашел используется всяческая визуальная обвязка и встроенный парсинг результатов , которые мне не нужны ...
Последний раз редактировалось Alex2013 28.01.2016 16:36:00, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Kitayets » 26.01.2016 17:05:16

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

ИМХО никто такие бредовые задачи не решает при работе с базами данных. Общеупотребительные компоненты направленны на "более не менее" стандартный паттерн использования.
Kitayets
постоялец
 
Сообщения: 171
Зарегистрирован: 05.05.2010 21:15:24

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

Сообщение Alex2013 » 27.01.2016 18:02:24

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

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

Я просто не разобрался с библиотекой продержки SQLite в Лазарусе .
( элементарно не понял как получить полный ответ на запрос по аналогии с консольной версией .)
То есть конкретно не понял какое поле класса SQLite3Connection сдержит полный текст ответа на произвольный запрос .
(Его ведь просто не может не быть )
Зы
Если нетрудно, пожалуйста, кинете пример (там же как понимаю буквально пара строчек кода )
Зы Зы
О существовании .FieldByName( ) знаю, но как получить ответ если заранее не ясно что за поле будет нужно ?
Зы Зы Зы
Накопал массив
SQLQuery3.Fields[..] Это вроде то что надо ?
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение pupsik » 27.01.2016 19:35:28

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

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

п.с.
Хотя: можно узнать кол-во таблиц, схему и узнать какие поля "привинчены" в таблицу. Все что есть в public -е датасета. А вот работать с таблицей только через SQLQuery. Или использовать компоненты с "прямым" доступом (обертки всякие).
pupsik
энтузиаст
 
Сообщения: 1154
Зарегистрирован: 20.08.2014 16:20:13

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

Сообщение Снег Север » 27.01.2016 20:11:46

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

Если вы не знаете названий полей, то да, то что вам надо. Но что вам мешает читать служебную информацию базы SQLite, где есть все описания, мне непонятно.
Аватара пользователя
Снег Север
долгожитель
 
Сообщения: 3053
Зарегистрирован: 27.11.2007 16:14:47

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

Сообщение Alex2013 » 27.01.2016 20:33:43

Что ж спасибо за ответы ...
Пока буду пробовать то что уже нарыл .
(Понимаю что вопрос был из области "тупых" ( на который подмывает ответить "гугл в помощь" и 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 17:30:14, всего редактировалось 1 раз.
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44

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

Сообщение Alex2013 » 18.02.2016 17:27:47

Для комплекта ...
Простой код для запросов на изменение БД
(То есть 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 ;
Alex2013
долгожитель
 
Сообщения: 3145
Зарегистрирован: 03.04.2013 11:59:44


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 255

Рейтинг@Mail.ru