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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> По-разному выполняются SQL-запросы в Builder C++ и, SQLite Expert 
:(
    Опции темы
petlyura
Дата 20.10.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 162
Регистрация: 30.1.2008
Где: Харьков

Репутация: нет
Всего: 2



Здравствуйте, форумчане, помогите, разъясните.

Установил ODBC драйвер для SQLite3. Установил также прогу SQLite Expert, чтобы просматривать записи таблиц БД и выполнять SQL-запросы. 
Программирую в среде Builder C++ 6. Работаю с БД SQLite через ADO.
Вот  добавляю запрос в ADOQuery. И получаю результаты. Зачастую все работает адекватно. Но было пару запросов, результаты которых меня не устраивали. Я проверяю результаты через SQLite Expert, просто копирую туда SQL-текст. 
К примеру:

Код

TADOQuery* ReadOperator = new TADOQuery(NULL);
  ReadOperator->ConnectionString = Connect;
  ReadOperator->SQL->Clear();
  ReadOperator->Parameters->Clear();
  TParameter *p = ReadOperator->Parameters->AddParameter();
   p->DataType = ftInteger;
   p->Direction = pdInput;
   p->Name = "DateF";
   TParameter *p1 = ReadOperator->Parameters->AddParameter();
   p1->DataType = ftInteger;
   p1->Direction = pdInput;
   p1->Name = "TimeF";
   TParameter *p2 = ReadOperator->Parameters->AddParameter();
   p2->DataType = ftInteger;
   p2->Direction = pdInput;
   p2->Name = "DateS";
   TParameter *p3 = ReadOperator->Parameters->AddParameter();
   p3->DataType = ftInteger;
   p3->Direction = pdInput;
   p3->Name = "TimeS"; 

  ReadOperator->SQL->Add ("SELECT * FROM Operator WHERE ((DateCmd<:DateF AND DateCmd>:DateS) OR (DateCmd=:DateF AND TimeCmd<:TimeF) OR (DateCmd=:DateS AND TimeCmd>=:TimeS)) ORDER BY DateCmd, TimeCmd;");

  ReadOperator->Prepared = true;

  ReadOperator->Parameters->ParamByName("DateS")->Value = ArhRange.Start.Date;
  ReadOperator->Parameters->ParamByName("DateF")->Value = ArhRange.Finish.Date;
  ReadOperator->Parameters->ParamByName("TimeS")->Value = ArhRange.Start.Time;
  ReadOperator->Parameters->ParamByName("TimeF")->Value = ArhRange.Finish.Time;
ReadOperator->Open(); 
ReadOperator->First();
...

Так результат такого выполнения получается, как будто выполнился запрос:
Код

SELECT * FROM Operator WHERE (DateCmd<:DateF AND DateCmd>:DateS) ORDER BY DateCmd, TimeCmd;


Т.е. вторая и третья часть условия не срабатывают.
А вот в SQLite Expert'е учитываются все условия WHERE, да и если в Builder'е подставить значения вместо параметров, то результат выходит верным:
Код

AnsiString DateF, DateS, TimeF, TimeS;

  DateS = IntToStr(ArhRange.Start.Date);
  DateF = IntToStr(ArhRange.Finish.Date);
  TimeS = IntToStr(ArhRange.Start.Time);
  TimeF = IntToStr(ArhRange.Finish.Time);

  ReadOperator->SQL->Add ("SELECT * FROM Operator WHERE ((DateCmd<"+DateF+" AND DateCmd>"+DateS+") OR (DateCmd="+DateF+" AND TimeCmd<"+TimeF+") OR (DateCmd="+DateS+" AND TimeCmd>="+TimeS+")) ORDER BY DateCmd, TimeCmd;");


И вот такой запрос бочил:
Код

QueryDbv->SQL->Add("SELECT StartHour.SHIndex*0 AS Ind, StartHour.StartValue AS Val, StartHour.StartOffset AS Offs FROM StartHour, Ehour WHERE (StartHour.HIndex = :HInd AND StartHour.StartOffset IN ("+stroffs+") AND StartHour.HIndex = Ehour.HIndex) ");

QueryDbv->SQL->Add("UNION SELECT Event.SIndex AS Ind, Event.CurValue AS Val, Event.Offset AS Offs FROM Event INNER JOIN Esec ON Esec.SIndex = Event.SIndex INNER JOIN Emin ON Emin.MIndex = Esec.MIndex INNER JOIN Ehour ON Ehour.HIndex = Emin.HIndex WHERE (Event.SIndex <= :SInd AND Ehour.HIndex = :HInd AND Event.Offset IN ("+stroffs+")) ORDER BY Ind, Offs ;");


Пришлось разбить его на 2 отдельных запроса и выполнять их отдельно, а то возвращал ранее результат только того SELECT, что до UNION'а. Хотя с другими запросами с UNION проблем не возникало

Может, дело в промежуточных оболочках типа драйвера или ADO, может в работе с параметрами? 

Заранее благодарю
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Составление SQL-запросов | Следующая тема »


 




[ Время генерации скрипта: 0.0380 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.