Задача: на произвольный SQL запрос получить не мене произвольный ответ в виде текста ...
Нужно что-то вроде такого кода :
WSForm.SQLite3Connection1.DatabaseName:=N;
...
WSForm.SQLite3Connection1.ExecuteDirect(Par);
...
Rez:= WSForm.SQLite3Connection1. (??)
Во всех примерах , что я нашел используется всяческая визуальная обвязка и встроенный парсинг результатов , которые мне не нужны ...
SQLite3 Упрощенный доступ
Модератор: Модераторы
SQLite3 Упрощенный доступ
Последний раз редактировалось Alex2013 28.01.2016 15:36:00, всего редактировалось 1 раз.
а если тебе на миллиард записей с БЛОБ-ами приедет, тоже тебе произвольной строкой/текстом это отдать?
ИМХО никто такие бредовые задачи не решает при работе с базами данных. Общеупотребительные компоненты направленны на "более не менее" стандартный паттерн использования.
Код: Выделить всё
SELECT * FROM TABLE;ИМХО никто такие бредовые задачи не решает при работе с базами данных. Общеупотребительные компоненты направленны на "более не менее" стандартный паттерн использования.
Уфф ! "Товарищ не понимает "
Еще раз ...
1. База локальная простейшая
2. Запросы я худо бедно писать умею и (о ужос!
) знаю как просить чтобы на выходе было именно то количество строк что мне нужно...
3. С базой пока работаю вызывая консольную утилиту SQLite3.exe ...
4. Все что мне надо от SQLite УЖЕ работает. (и транслируется в Веб-интерфейс )
Я просто не разобрался с библиотекой продержки SQLite в Лазарусе .
( элементарно не понял как получить полный ответ на запрос по аналогии с консольной версией .)
То есть конкретно не понял какое поле класса SQLite3Connection сдержит полный текст ответа на произвольный запрос .
(Его ведь просто не может не быть )
Зы
Если нетрудно, пожалуйста, кинете пример (там же как понимаю буквально пара строчек кода )
Зы Зы
О существовании .FieldByName( ) знаю, но как получить ответ если заранее не ясно что за поле будет нужно ?
Зы Зы Зы
Накопал массив
SQLQuery3.Fields[..] Это вроде то что надо ?
Еще раз ...
1. База локальная простейшая
2. Запросы я худо бедно писать умею и (о ужос!
3. С базой пока работаю вызывая консольную утилиту SQLite3.exe ...
4. Все что мне надо от SQLite УЖЕ работает. (и транслируется в Веб-интерфейс )
Я просто не разобрался с библиотекой продержки SQLite в Лазарусе .
( элементарно не понял как получить полный ответ на запрос по аналогии с консольной версией .)
То есть конкретно не понял какое поле класса SQLite3Connection сдержит полный текст ответа на произвольный запрос .
(Его ведь просто не может не быть )
Зы
Если нетрудно, пожалуйста, кинете пример (там же как понимаю буквально пара строчек кода )
Зы Зы
О существовании .FieldByName( ) знаю, но как получить ответ если заранее не ясно что за поле будет нужно ?
Зы Зы Зы
Накопал массив
SQLQuery3.Fields[..] Это вроде то что надо ?
http://wiki.freepascal.org/SQLdb_Tutorial1
SQLite3Connection - это способ доступа (если можно так назвать). А SQLQuery - способ работы с бд.
По идее ваш вопрос странен.
В лазаре есть еще один дополнительный компонент. Он может работать в "две стороны".
п.с.
Хотя: можно узнать кол-во таблиц, схему и узнать какие поля "привинчены" в таблицу. Все что есть в public -е датасета. А вот работать с таблицей только через SQLQuery. Или использовать компоненты с "прямым" доступом (обертки всякие).
SQLite3Connection - это способ доступа (если можно так назвать). А SQLQuery - способ работы с бд.
По идее ваш вопрос странен.
В лазаре есть еще один дополнительный компонент. Он может работать в "две стороны".
А что сложного. БЕрем список полей и проганяем в цикле..FieldByName( ) знаю, но как получить ответ если заранее не ясно что за поле будет нужно ?
п.с.
Хотя: можно узнать кол-во таблиц, схему и узнать какие поля "привинчены" в таблицу. Все что есть в public -е датасета. А вот работать с таблицей только через SQLQuery. Или использовать компоненты с "прямым" доступом (обертки всякие).
- Снег Север
- долгожитель
- Сообщения: 3071
- Зарегистрирован: 27.11.2007 15:14:47
- Контактная информация:
Alex2013 писал(а):SQLQuery3.Fields[..] Это вроде то что надо ?
Если вы не знаете названий полей, то да, то что вам надо. Но что вам мешает читать служебную информацию базы SQLite, где есть все описания, мне непонятно.
Что ж спасибо за ответы ...
Пока буду пробовать то что уже нарыл .
(Понимаю что вопрос был из области "тупых" ( на который подмывает ответить "гугл в помощь" и RTFM)
но думал что кто-то просто знает готовое решение ... )
Добавлено спустя 19 часов 59 минут 10 секунд:
В общем родил я вот такой код ( и что удивительно он даже работает! )
Результат понятное дело возвращает в Result
Вопросы:
1 Не заложил ли я где-то по не знанию какой нибудь "логической бомбы " ?
2 Можно ли это чудище упростить ?
Зы
На вопрос "зачем все это " ?
Ответ простой "Чтобы не менять логику уже готовой надстройки " ( и кроме того у меня логика работы с произвольной БД может быть реализована в скрипте, который будет правится без необходимости менять исходники веб-сервера, а значит нельзя всегда исходить из посылки, что формат запросов и результатов будет постоянным .)
Пока буду пробовать то что уже нарыл .
(Понимаю что вопрос был из области "тупых" ( на который подмывает ответить "гугл в помощь" и RTFM)
Добавлено спустя 19 часов 59 минут 10 секунд:
В общем родил я вот такой код ( и что удивительно он даже работает! )
Результат понятное дело возвращает в 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 раз.
Для комплекта ...
Простой код для запросов на изменение БД
(То есть DELETE INSERT UPDATE CREATE... Обрабатывает по одному запросу за один раз... сложно составные запросы разделенные через "; " неподерживает )
Предыдущий код работает только с SELECT ( Кстати, интересно почему ? )
Простой код для запросов на изменение БД
(То есть 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 ;
