![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Помогите пожалуйста! [D5, ]
DeNNiss © (2002-01-17 08:08:00)Имеется такой запрос:
with DM.Query5 do begin
SQL.Clear;
Close;
SQL.Add("SELECT * FROM DATA WHERE LPUMG = :LPUMG AND DATA = :DATA AND KABEL = :KABEL")
ParamByName("LPUMG").Value := DM.tbData.FieldByName("lpumg").AsString;
ParamByName("DATA").Value := DM.tbData.FieldByName("Data").AsDateTime;
ParamByName("KABEL").Value := DM.tbData.FieldByName("NumKabel").AsInteger;
Open;
end;
Но, ругается на последний параметр:ParamByName("KABEL").Value := DM.tbData.FieldByNamе("NumKabel").AsInteger;, пишет "Несоответствие типов данных в условии отбора"... Без этого параметра все работает зыко. В чем проблема, подскажите?
Леван (2002-01-21 08:36:00) [1]А какого типа kabel from DATA? numeric or decimal и величина передаваемого фактического параметра?
Dok_3D (2002-01-18 07:02:00) [2]>DeNNiss
Но, ругается на последний параметр: ParamByName("KABEL").Value := DM.tbData.FieldByNamе("NumKabel").AsInteger;, пишет "Несоответствие типов данных в условии отбора"...
Ставь принудительно для каждого параметра конструкцию типа -
ParamByName("KABEL").DataType:=ftInteger;
plis (2002-01-17 20:46:00) [3]лучший вариант
установи DataSource к набору DM.tbData
DM.Query5.Datasuorce сошли на DataSource
и тогда не надо уже присваивать параметры
with DM.Query5 do begin
SQL.Clear;
Close;
SQL.Add("SELECT * FROM DATA WHERE LPUMG = :LPUMG AND DATA = :DATA AND KABEL = :KABEL")
Open;
end;
Turalyon (2002-01-17 12:49:00) [4]>Wind
Во-первых, если ты пишешь запрос для большой БД, то не советую использовать конкатенацию строк - работает намного дольше, чем через ParamByName
Не знал такого... А почему?
>DeNNiss
Скажи какой у тебя тип поля numKabel и тип поля KABEL???
Wind (2002-01-17 12:01:00) [5]Во-первых, если ты пишешь запрос для большой БД, то не советую использовать конкатенацию строк - работает намного дольше, чем через ParamByName
Во-вторых, не используй ParamByName.Value - лучше укажи явное преобразование типов.
Ну и последнее - по возможности откажись от БДЕ, если работаешь через нее например с Ораклом.
DeNNiss (2002-01-17 11:34:00) [6]Нет, никак не получается, уперлось Дельфи и ни в какую :(( По разному пробовал - нифига, таже ошибка, хоть тресни....
Desdechado (2002-01-17 10:03:00) [7]не используй
ParamByName("KABEL").Value
это приводит к вариантному преобразованию, что в итоге будет - только дельфи знает. Используй явное AsInteger, AsDateTime и т.д.
Turalyon (2002-01-17 09:15:00) [8]Да не очень внятно получилось в хвостах... там написана двойная кавычка в одинарных " " "
Turalyon (2002-01-17 09:14:00) [9]>DeNNiss
Попробуй вот так
SQL.Add("SELECT * FROM DATA")
SQL.Add("where LPUMG = "" + DM.tbData.FieldByName("lpumg").AsString + """);
SQL.Add("and KABEL = " + DM.tbData.FieldByName("NumKabel").AsString);
SQL.Add("and DATA = "" + DM.tbData.FieldByName("Data").AsString + """);
Или если не будет работать
То попробуй поменять последнюю строку на такую
SQL.Add("and DATA = "" + DateToStr(DM.tbData.FieldByName("Data").AsDateTime) + """);
Да и еще не очень хорошо выглядят названия полей, особенно data (ИМХО), можно напороться на зарезервированные слова и будешь потом долго думать почему не работает.
DeNNiss (2002-01-17 08:47:00) [10]> Turalyon, спасибо большое за помощь, но я пробовал твой код, там видимо действительно проблема в кавычках, не получилось, в книге нашел нужный пример, все вроде заработало, но возникла вот новая проблема.
roottim (2002-01-17 08:39:00) [11]в пр-пе должно работать!
советую посмотреть его через скажем ShowMessage... все ли правильно в синтаксисе... и соответствии типу поля
Turalyon (2002-01-17 08:32:00) [12]Попробуй поставить
ParamByName("KABEL").AsInteger = DM.tbData.FieldByName("NumKabel").AsInteger;
Либо вообще повыкидывай все эти параметры и делай строками, как я писал тебе в одном из примеров ниже.