|
Тема
|
IBQuery.ParamByName('').Length ???
|
|
Автор | EFEX (Нерегистриран) |
Публикувано | 13.12.06 21:11 |
|
DELPHI 7
Firebird
Как мога да прочета каква е дължината(Length) на параметър
IBQuery.ParamByName('FIELD_NAME')
Дължината се пази в private на
TIBXSQLVAR.FMaxLen
При сетване на параметрите не се прави проверка.
Проверката за коректноста на дължината се прави при Open/ExecSQL и тогава гърми че дължината е надвишена.
целта ми е процедура от вида:
IBQuery.ParamByName('THIS_FIELD').AsString :=
Copy(MyValue,1,
MyProcedureGetParamLength(IBQuery.ParamByName('THIS_FIELD')));
т.е. да се truncate-ва подаваната стойност
BeforeAnswer(10x);
| |
Тема
|
Re: IBQuery.ParamByName('').Length ???
[re: EFEX]
|
|
Автор |
Dark_Dirk (^) |
Публикувано | 13.12.06 22:18 |
|
За TIBDataset го правим по следния много грозен начин:
ParamOK := FALSE;
repeat
try
(DataSource.DataSet as TIBDataSet).ParamByName('param name').AsString := s;
ParamOK := TRUE;
except
if (s = '') then
raise;
s := Copy(s, 1, Length(s) - 1);
end;
until ParamOK;
С прости думи: режем го с по един символ от края докато влезе .
Друг вариант е да си patch-неш IBX-a и да изкараш MaxLen като property в TIBXSQLVAR.
| |
|
Не знам защо, ама Params на IBQuery е направено да си връща пак TParams. Нали го знаеш ония виц за най-често споменавания мъж сред математиците - Коши. Имал теорема за всичко. А коя била най-често споменаваната жена сред математиците? Майка му на Коши. Много често я споменавали Та и аз да спомена (за пореден път) майка му на Джеф Оувъркеш...
Та на въпроса - кастни си кюрито до TIBDataSet и пробвай така:
TIBDataSet(IBQuery).Params[0].Size
Би трябвало да стане. Дано да ти свърши работа!
| |
Тема
|
Re: IBQuery.ParamByName('').Length ???
[re: andrew_nikoloff]
|
|
Автор | Dark Dirk (Нерегистриран) |
Публикувано | 14.12.06 09:49 |
|
Абе може и да не стане мамка му.
Това е коментара, който седи пред нашия грозен код:
// Реже текста до дължината, която може да влезе в този параметър
{ това за съжаление не работи, защото Size след първото присвояване AsString има стойност равна
на дължината на стринга :(
(DataSource.DataSet as TIBDataSet).ParamByName('param name').AsString :=
Copy(s, 1, (DataSource.DataSet as TIBDataSet).ParamByName('param name').Size);
}
Но пробвай. Ние използваме версия на IBX X.03. Следващата беше много бъгава и строши проекта и престанахме да update-ваме IBX. Мислим някой ден да мигрираме към FIBPlus.
| |
Тема
|
Re: IBQuery.ParamByName('').Length ???
[re: andrew_nikoloff]
|
|
Автор | EFEX (Нерегистриран) |
Публикувано | 14.12.06 09:49 |
|
Това с кастването стана и изглежда много елегантно НО (естествено има винаги едно НО) за съжаление минава само веднъж защото при ExecSQL Size се нулира и за следващите йок!!!
пробвах даже да Prepare-вам всеки път но не помага !!!???!!!
IBQInsert.ParamByName('ADDRESS').AsString :=
Copy(IBQRead.FieldByName('ADRES').AsString,1,
TIBDataSet(IBQInsert).ParamByName('ADDRESS').Size);
| |
|
Мда... Още една причина да спомена майка му на Джеф
Ние сме с Х.04. Има няколко дребни бъгчета, ама си ги знаем и не ни създават проблеми. Но щом вие сте имали - кофти
FIBPlus разбира се е много по-добре от IBX, ама лошото е, че е малко скъпичък ($1600) и нещо не виждам смисъл да мигрираме към него, след като IBX-а си ни върши работа.
Аз наистина го пробвах само веднъж това. Ама като не ще с добро - дайте да обърнем дебелия край на тоягата Какво ще стане, ако "пробно" преди туй нещо си запази човек заявката, изтрие SQL пропъртито и му върне пак старата заявка? Няма ли пак да си ги инициализира? Честно казано малко ме мързи да пробвам. В момента само за топло кафенце си мисля
Кажете после ако това закърпва нещата!
Айде успех!
| |
Тема
|
Re: IBQuery.ParamByName('').Length ???
[re: andrew_nikoloff]
|
|
Автор | Dark Dirk (Нерегистриран) |
Публикувано | 14.12.06 10:05 |
|
FIBPlus за България струва:
Лицензия FIBPlus Single (1 копие) 477.43 лева (за 1 бройка)
Лицензия FIBPlus Single (2-3 копия) 430.70 лева (за 1 бройка)
Лицензия FIBPlus Single (4-5 копия) 381.94 лева (за 1 бройка)
Лицензия FIBPlus Site License (неограничено количество копия) 2 539.50 лева (за 1 бройка)
| |
Тема
|
Re: IBQuery.ParamByName('').Length ???
[re: andrew_nikoloff]
|
|
Автор | EFEX (Нерегистриран) |
Публикувано | 14.12.06 10:41 |
|
Вкарах инициализациата на SQL.Text в while цикъла с който въртя записите и стана.Все още незнам как ще се отрази на скороста.. но предполагам че доста ще се отрази като се има впредвид че всеки Exec ще Prepare-ва.
| |
|
Ами а де! 2539.50 лева да не са малко? Не че не се изплащат, ама в случая на нас ще ни отнеме много повече ресурс миграцията към FIB-а, отколкото самата му цена
| |
|
Прав си . То и ние затова ползваме IBX-a.
| |
|
|
|
|