Здравствуйте, форумчане, помогите, разъясните. Установил 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, может в работе с параметрами? Заранее благодарю
|