powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обвёртка для выполнения запросов
17 сообщений из 17, страница 1 из 1
Обвёртка для выполнения запросов
    #39684015
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подскажите, в какую сторону смотреть.
Пример, есть в классе методы для выполнения запросов.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
procedure InitQuery(var Query: TIBQuery; ParamNames: string;
  ParamValues: array of Variant);
var
  Par: TParam;
  pc,i:Integer;
begin
 pc:=WordCount(ParamNames,';')-1;
 for i:=0  to pc do
  begin
   par:=Query.Params.FindParam(ExtractWord(ParamNames,';', i+1));
   par.Value:=ParamValues[i];



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
function QSelSQL(SQL, ParamNames: string;
  ParamValues: array of Variant): TIBQuery;
begin
  IBQuery1.SQL.Add(SQL);
  InitQuery(IBQuery1,ParamNames,ParamValues);
  IBQuery1.Prepare;
  IBQuery1.Open;
  Result:=IBQuery1;




Код: sql
1.
Q:=QSelSQL(' select * from table where field=:field ','field',['1'])



Если в ParamValues передать больше 13 символов возвращаеться ошибка
Код: pascal
1.
EIBClientError with message Trying to store a string of length 14 into a field that can only contant 13


Понимаю что ругается на длину строки, но почему так получается?
Если просто написать
Код: pascal
1.
2.
3.
4.
5.
6.
IBQuery1.Transaction.StartTransaction;
  IBQuery1.SQL.Clear;
  IBQuery1.SQL.Add('select * from table where field=:field');
   IBQuery1..ParamByName('field').asstring:='11111111111111111';  
  IBQuery1.Prepare;
  IBQuery1.Open;


все ок.
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39684028
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
потому что поле в таблице БД ограничена 13-ю символами
Тем более, что это написано открытым текстом в сообщении
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39684792
Sashaua
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
defecatorпотому что поле в таблице БД ограничена 13-ю символами
Тем более, что это написано открытым текстом в сообщении

На самом деле у меня следующая конструкция.
Выборка из процедуры
Код: sql
1.
select * from SELECT_PRICE (:ID_BUILDER)


В нутри процедуры есть условие
Код: sql
1.
where ((:ID_BUILDER containing '~' || D.ID || '~') or ('~' || D.ID || '~' containing :ID_BUILDER))


Мне надо в параметр процедуры передать несколько значений, сделал согласно http://www.ibase.ru/ibfaq/#inparam
Строка собираеться на клиенте имеет вид: ~1~4~54~25~14~63~521~78~

Когда делаю
IBQuery1.Transaction.StartTransaction;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from SELECT_PRICE (:ID_BUILDER)');
IBQuery1..ParamByName('field').asstring:='~1~4~54~25~14~63~521~78~';
IBQuery1.Prepare;
IBQuery1.Open;
отрабатывает без ошибок.
Когда через обвертку вылазит проблема с ограничением символов.
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39684799
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Отладчиком надо воспольоваться и посмотреть, что реально передается
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685024
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashauaКогда делаю
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('select * from SELECT_PRICE (:ID_BUILDER)');


не надо плохие примеры повторять за всеми подряд.....
а если переписываете с забора в тетрадку, то обдумывать надо что переписываете и зачем это надо.

Sashaua
Код: pascal
1.
2.
3.
4.
5.
function QSelSQL(SQL, ParamNames: string;
  ParamValues: array of Variant): TIBQuery;
begin
  IBQuery1.SQL.Add(SQL);
  InitQuery(IBQuery1,ParamNames,ParamValues);



Где вызов TStrings.Clear ?
И на почему бы просто не сделать обычное a := b ?

Код: pascal
1.
2.
3.
4.
function QSelSQL(const SQL, ParamNames: string;
  ParamValues: array of Variant): TIBQuery;
begin
  IBQuery1.SQL.Text := SQL;



и нате вам ещё одну обёртку http://www.loginovprojects.ru/index.php?page=ibxfbutils
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685027
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua
Код: pascal
1.
procedure InitQuery(var Query: TIBQuery;



почему var ?????

вообьще-то const должно быть
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685032
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sashaua
Код: pascal
1.
 pc:=WordCount(ParamNames,';')-1;


Код: pascal
1.
  par:=Query.Params.FindParam(ExtractWord(ParamNames,';', i+1));



вот надо же на пустом месте тормоза изобретать....
не читайте на заборах черт-те чего

ExtractWord - это когда нужно только одно слово из высех, ну от силы 2-3.
Если нужны все - делай сразу массив строк в один шаг и потом используй его.
А ты n+1 поиск про строке делаешь вместо одного единственного.

https://stackoverflow.com/questions/2625707/split-a-string-into-an-array-of-strings-based-on-a-delimiter
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685091
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

авторвообьще-то const должно быть

вообще не нужно модификаторов. в его случае смысла чуть меньше чем нет совсем в них.
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685103
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685386
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

лучше начинать с модификатора const так же как все новый члены классов нужно вводить как striuct private

Добавить возможностей если поднадобятся - успеешь.
А начинать надо с максимальной гибкости и безопасности.
Поэтому по умолчанию - const. И если протупишь и по ошибке попробуешь затереть указатель на объект - тебя компилятор сразу поправит. И это полезно, от собственных ошибок сразу на автомате защищаться.
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685389
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685503
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ariochmakhaon,

лучше начинать с модификатора const так же как все новый члены классов нужно вводить как striuct private

Добавить возможностей если поднадобятся - успеешь.
А начинать надо с максимальной гибкости и безопасности.
Поэтому по умолчанию - const. И если протупишь и по ошибке попробуешь затереть указатель на объект - тебя компилятор сразу поправит. И это полезно, от собственных ошибок сразу на автомате защищаться.

Если бы это было настолько полезно, среда бы по умолчанию вставляла. А так только пальцами лишние символы набивать и размер кода увеличивать.
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685520
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schiсреда бы по умолчанию вставляла

ага, и выдумывала бы вместо человека какие и сколько параметров функции нужны
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685555
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

даже если и затрёт - то максимум в пределах внутренности функции (если никакого не будет, с var - самый плохой вариант). да и то нужно совсем уж затупить.
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685556
Фотография makhaon
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arioch,

пеганза, например, наличие const в этом месте считает плохим стилем.
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39685589
Arioch
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
makhaon,

o_O

а она это как-то мотивирует ?


makhaonмаксимум в пределах внутренности функции

В принципе - да, если сделано "по классике" и объект создаётся и удаляется в одном месте.
Но все равно, даже и в пределах - может быть неприятно.

С другой стороны, я вообще начитавшись всякой функциональщины превентивно не люблю переменные (у которых можно изменять значение)
...
Рейтинг: 0 / 0
Обвёртка для выполнения запросов
    #39687519
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В режиме ARC const у объектных параметров уже полезен.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Обвёртка для выполнения запросов
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]