powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
23 сообщений из 23, страница 1 из 1
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37838306
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток.
Работаю с SQLite совсем недавно, и натолкнулся на такую проблему:
нужно получать информацию о таблице; запрос стандарьный:
Код: sql
1.
 PRAGMA table_info(<TableName>);


В оболочке SQLite Expert выполняется на ура, хоть в кавычках имя, хоть без.
Есть надстройка - программа, которая должна коннектиться к БД не только SQLite'ной, но и к MS, а в перспективе - к PG (пере-соединение - "на лету").
Поэтому используются компоненты TADOConnection и TADOQuery; БД описана через ODBC (SQLite3 ODBC driver).
ЛЮБЫЕ запросы выполняются на ура, кроме этого.
Хоть с наборами данных (данные приходят коректно), хоть просто команды.
Код: pascal
1.
2.
Process ... raised exception class EOleException with message
'Текущий поставщик не поддерживает возврат нескольких наборов записей в результате выполнения одной операции.'


Кусок кода, вызывающий ошибку:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
  ADOQuery1.Close;
  ADOQuery1.SQL.Clear;
  //ADOQuery1.SQL.Add('PRAGMA table_info(TAccount);'); // пляска с бубном, задаю запрос хоть так
  ADOQuery1.SQL.Text := 'PRAGMA table_info(TAccount);'; // хоть так,  результат - один
  try
    ADOQuery1.Open;
  except
    on E:Exception do begin
        ShowMessage('Error getting table info, error '
          + IntToStr(GetLastError)
          + ': ' + E.Message);
      end;
  end;


Выкладываю запрос в TMemo на форме - один он там, хоть убей; смотрю текст запроса через инспектор дэлфи - вижу:
Код: pascal
1.
'PRAGMA table_info(TAccount);'#$D#$A  (read=GetTextStr write=SetTextStr)


Кто-нибудь сталкивался с такой проблемой? Может, дело в настройках БД / ODBC / ADOConnection?
Какие-нибудь идеи есть?
Просто мозг сломал...
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37838358
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_Gap,

А зачем точка с запятой?
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37838367
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привычка.
Пробовал и без нее,- разницы никакой.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37838483
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_Gap,

Попробуйте тот же запрос, через тот же драйвер, но в другой среде. Например, через MS Access. Сравните, будут ли различия в поведении.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37838501
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не, Access кроме DML ничего не понимает...
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37838898
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RXLПопробуйте тот же запрос, через тот же драйвер, но в другой среде. Например, через MS Access. Сравните, будут ли различия в поведении.
А смысл?
- Access, насколько я помню, не поддерживает команду PRAGMA;
- этот запрос мне нужен в моей среде.

Пока что обхожусь парсингом поля 'SQL' из sqlite_master. Но это - самоделка, рядом с удобной, фирменной вещью, которая есть, но не работает.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37838945
RXL
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_Gap,

Смысл чтобы понимать, кто виноват.

Фирменная вещь занимается тем же самым.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37839124
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
RXLФирменная вещь занимается тем же самым.
Получается, что нет.
Там откуда-то вылазит ВТОРОЙ рекордсет.
Если я выполняю запрос:
Код: sql
1.
select * from sqlite_master where type = 'table' and tbl_name = 'TAccount'; 


, то все выполняется корректно, приходит один рекордсет с одной записью, и с данными можно разбираться.
Значит, PRAGMA делает что-то еще, кроме Select'а; именно PRAGMA, а не ODBC / ADOConnection.
RXLСмысл чтобы понимать, кто виноват.
Согласен. Но не способен: SQLite - на сях написан, там можно было бы посмотреть (и увидеть!) реализацию этой самой прагмы.
Потому и спрашиваю здесь, а не просмотриваю коды на официальной странице лайта.
Должен же кто-нибудь знать разницу между Select'ом и прагмой?
(Как в фильме "ДМБ":
- Суслика видишь?
- Нет.
- И я - нет. А он - есть.
)
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37845043
MaratIsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_Gap,

какой набор данных ты ждешь от прагмы?!

pragma - это ExecSQL
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37845608
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MaratIskкакой набор данных ты ждешь от прагмы?!
Просто один набор данных, тот самый, который появляется в SQLite Expert.
Но там - я его вижу, а на приложении - получаю исключение. В этом и причина появления моего вопроса здесь (см.мое первое сообщение).
Причем ошибка - не ОТСУТСТВИЕ набора данных, а присутствие БОЛЕЕ, ЧЕМ ОДНОГО набора данных. Это и поставило в тупик.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37845666
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2MaratIsk:
Да, вот еще что забыл сказать:
те компоненты, что используют sqlite3.dll (в сети есть модули SQLite3.pas и SQLiteTable3.pas) прекрасно переваривают строку
Код: sql
1.
PRAGMA table_info(<TableName>);


как текст запроса, и возвращают ровно один набор данных. Просто в моем проекте они не могут использоваться; причины - указал.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37846794
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
И еще 2MaratIsk:
MaratIskpragma - это ExecSQL
Это - СОВСЕМ НЕ ExecSQL для ADO-компонентов; этот метод не возвращает набор данных, даже если таковой появляется при выполнении запроса.
Попробуйте в ADOQuery задать текст запроса (свойство SQL):
Код: sql
1.
select * from SomeTable;


, и увидите разницу между ExecSQL и Open.
В первом случае - привязанный грид остается пустым.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37847026
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_GapПричем ошибка - не ОТСУТСТВИЕ набора данных, а присутствие БОЛЕЕ, ЧЕМ ОДНОГО набора данных. Это и поставило в тупик.Ну а что тебе мешает выбрать эти несколько наборов данных?
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37847095
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlНу а что тебе мешает выбрать эти несколько наборов данных?
Мне - ничего; что такое NextRecordset - знаю, пользовал, но с MS SQL'ной БД.
Но сообщение об ошибке - русским по белому:
'Текущий поставщик не поддерживает возврат нескольких наборов записей в результате выполнения одной операции.'
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37847288
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_GapWhite OwlНу а что тебе мешает выбрать эти несколько наборов данных?
Мне - ничего; что такое NextRecordset - знаю, пользовал, но с MS SQL'ной БД.
Но сообщение об ошибке - русским по белому:
'Текущий поставщик не поддерживает возврат нескольких наборов записей в результате выполнения одной операции.'Значит меняй поставщика.
Или хотя-бы напиши разработчику, вдруг они почешутся и исправят ошибку?
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37847682
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl хотя-бы напиши разработчику
Только и остается.
Благо всемирная сеть дает такую возможность.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37849330
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Разработчику думаю можно и не писать - либо очень старая версия OLEDB
провайдера, либо разработчик забил на свое поделие. Потому как PRAGMA
для SQLite - свято.

Это надо было догадаться использовать dbGo для SQLite ... Cмотри в сторону
других универсальных библиотек - (Any|Uni)DAC. Как минимум PRAGMA там
работает :)
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37849347
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dmitry ArefievЭто надо было догадаться использовать dbGo для SQLite ...А ты откуда знаешь что там dbGo используется? Еще раз просмотрел посты ТС и нигде ничего характерного именно для dbGo не увидел... Или ты по ошибке определил?
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37851377
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_GapПоэтому используются компоненты TADOConnection и TADOQuery
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37853031
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievРазработчику думаю можно и не писать
Поздно. Уже написал, и именно разработчику ODBC-драйвера, Кристиану Вернеру (Christian Werner, chw@ch-werner.de).
Dmitry ArefievPRAGMA для SQLite - свято.
А он так не считает...

Его ответ:
Christian WernerThe PRAGMA handling is left out by intent:

- ODBC is an abstraction layer which isolates you from the details of a specific database
- the PRAGMA command is SQLite specific
- you should use SQLGetTables() et.al. instead of "PRAGMA table_info"

Даже продолжать переписку не хочется.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37853245
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Serg_GapChristian WernerThe PRAGMA handling is left out by intent:
Ответ в мусорную корзину. Разработчику заняться другими проектами.
А тебе больше не работать с SQLite через dbGo / ADO / ODBC.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37853374
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry ArefievА тебе больше не работать с SQLite через dbGo / ADO / ODBC.
Рад бы в рай...
Все предыдущие проекты переписывать? Там есть и MS, и PG отчасти, и теперь вот SQLite уже есть...
Полиморфизм, однако.
...
Рейтинг: 0 / 0
Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
    #37853436
Serg_Gap
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже все понял. Предлагаю закрыть тему.
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Связка SQLite + Delphi: ошибка выполнения запроса PRAGMA при коннекте через ODBC
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]