![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Variant := := StrToInt('1') приводит к исключению, почему?
Kolan © (2007-10-16 16:05:00)Сабж.
Делаю так:
function TQuestion.GetVariantFromValue: Variant;
begin
Result := 1;
case FDataType of
dtInteger:
Result := StrToInt('1');
dtFloat:
Result := StrToFloat(Value);
dtString:
Result := Value;
dtDateTime:
Result := StrToDateTime(Value);
end;
end;
А может мне это вообще не надо.
Есть ADOQuery
И параметр в запросе. Вот в этот параметр надо положить значание. Значение это всегда строка, а параметр любой, например int, может можно обойтись без GetVariantFromValue?
Query.Parameters.FindParam(S).Value := '1';
KSergey (2007-10-16 18:29:00) [1]> Kolan © (16.10.07 17:30) [35]
> Так везде ADO, я только про адо и говорю…
Ааа.
Оно как-то хитро зависит от самого запроса. Вернее - похоже там котрый "автоматический" анализатор - он не всегда умеет нормально разбирать.
В причины сего я не вдавался.
Kolan (2007-10-16 17:30:00) [2]> а всо то же Query.ParamCheck бездумно ставишь, помнишь?
Помню, не трогаю я его. В данном случае запрос вообще на дата модуль кинуть пришлось(для очётов). Как кинул ничего в нем не крутил
Это ADO. Здесь так не работает.
Так везде ADO, я только про адо и говорю
Reindeer Moss Eater (2007-10-16 17:04:00) [3]Это пипец и так делать нельзя.
Может и так.
Но тогда метода FindParam с аргументом <имя параметра> вообще не должно быть.
KSergey (2007-10-16 17:02:00) [4]> Kolan © (16.10.07 16:52) [30]
> И все сам он находил…
Это ADO. Здесь так не работает.
Правильный_Вася (2007-10-16 17:02:00) [5]
> И все сам он находил…
а всо то жеQuery.ParamCheckбездумно ставишь, помнишь?
KSergey (2007-10-16 17:01:00) [6]> Reindeer Moss Eater © (16.10.07 16:51) [29]
> Чудная у борланда реализация. А если у меня не один параметр
> с таким именем?
Это пипец и так делать нельзя.
О чем и тут много раз сообщалось.
Стандарный выход из ситуации- объявление внутри SQL переменной, присвоение ей значения параметра и использование далее в тексте SQL запроса уже переменной.
Kolan (2007-10-16 16:52:00) [7]Хз так как писал всегда:
Query.Connection := FDBConnection;
Query.SQL.Add('SELECT * FROM CONF_USER');
Query.SQL.Add('WHERE (NMUSER = :Login) AND (USERPASSWORD = :Password)');
Query.Parameters.FindParam('Login').Value := Login;
Query.Parameters.FindParam('Password').Value := Password;
И все сам он находил
Reindeer Moss Eater (2007-10-16 16:51:00) [8]Чудная у борланда реализация. А если у меня не один параметр с таким именем?
function TParameters.FindParam(const Value: WideString): TParameter;
var
I: Integer;
begin
for I := 0 to Count - 1 do
begin
Result := TParameter(inherited Items[I]);
if CompareText(Result.Name, Value) = 0 then Exit;
end;
Result := nil;
end;
KSergey (2007-10-16 16:50:00) [9]> Kolan © (16.10.07 16:49) [27]
> Query.Parameters.ParseSQL(Query.SQL.Text, True);
> Помогло! Что это было — хз…
При чем тут "хз"??! Вполне документировнное поведение.
Вы статейки-то проштудируйте. Там много чего пользительного понаписано.
Kolan (2007-10-16 16:49:00) [10]
> [24] KSergey © (16.10.07 16:43)
Query.Parameters.ParseSQL(Query.SQL.Text, True);
Помогло! Что это было хз
Kolan (2007-10-16 16:47:00) [11]Блин дело в запросе:
Вот большой запрос там парамерт не находит:
SELECT LTRIM(RTRIM(slsotr.famsotr)) + ' ' + LTRIM(RTRIM(slsotr.nmsotr)) + LTRIM(RTRIM(slsotr.otsotr)) AS [Property], 1-Sum(D.Factor)/Count(*) AS [Appraisal] FROM
(SELECT A.cdsotr, B.cddefect FROM ExpertAppraisalCard AS A
INNER JOIN ExpertAppraisalResult AS B
ON A.cdcard = B.cdcard
WHERE cdpackage = :PackageID) AS C
INNER JOIN ExpertAppraisalDefect AS D
ON C.cddefect = D.cddefect, slsotr
WHERE C.cdsotr = slsotr.cdsotr
GROUP BY C.cdsotr, LTRIM(RTRIM(slsotr.famsotr)) + ' ' + LTRIM(RTRIM(slsotr.nmsotr)) + LTRIM(RTRIM(slsotr.otsotr))
Ради эксперимента задал маленький запрос(понятно что бред наприса это эксперимент):
Query.SQL.Add('SELECT * FROM :PackageID');
Нашел параметр
Что за
KSergey (2007-10-16 16:45:00) [12]Удалено модератором
KSergey (2007-10-16 16:43:00) [13]> Kolan © (16.10.07 16:33) [19]
> Может надо что-то вызвать, чтобы он из текста эти параметры
> нашел… Почему список пустой…
Так ё-маё....
AdoQuery.Parameters.ParseSQL
Kolan (2007-10-16 16:42:00) [14]> Query.Parameters.FindParam(S).AsString := VarAsType(Value,
> varString)
Для инт:
Query.Parameters.FindParam(S).AsИнт := VarAsType(Value,
varИнт)
Незнаю я этого пока пишу, придется делать для разных типов
Kolan (2007-10-16 16:41:00) [15]Удалено модератором
Ega23 (2007-10-16 16:39:00) [16]
> Query.Parameters.FindParam(S).AsString
> Я не незнаю AsЧто когда пишу ког, это выясняется только
> в ран тайме…
>
Query.Parameters.FindParam(S).AsString := VarAsType(Value, varString)
?
Reindeer Moss Eater (2007-10-16 16:35:00) [17]Надо смотреть исходники адо. А косяков там вагон и маленькая тележка.
Kolan (2007-10-16 16:33:00) [18]Может надо что-то вызвать, чтобы он из текста эти параметры нашел Почему список пустой
> так что хоть Value хоть AsString здесь разницы не будет
Млин, а я нагородил :(
Reindeer Moss Eater (2007-10-16 16:31:00) [19]так что хоть Value хоть AsString - здесь разницы не будет
Kolan (2007-10-16 16:29:00) [20]Странно сволоч он
В тексте есть
ON A.cdcard = B.cdcard
WHERE cdpackage = :PackageID) AS C
Parametr := Query.Parameters.FindParam('PackageID'); возвращает nil
Query.Parameters.Items[0].Name; ругается что out of bound 0
А при Open говорит что не все параметры переданы