Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2012.01.29;
Скачать: CL | DM;

Вниз

Передать в Format дату   Найти похожие ветки 

 
Ega23 ©   (2011-10-19 10:24) [40]


> Есть принципиальная разница, что строго Text нужно применять?


В твоём конкретном примере - нет. Вообще - есть, и довольно серьёзная.
constructor TADOQuery.Create(AOwner: TComponent);
begin
 inherited Create(AOwner);
 FSQL := TStringList.Create;
 TStringList(FSQL).OnChange := QueryChanged;
 Command.CommandTextAlias := "SQL"; { Do not localize }
end;



> а Length(P) - 1 и High(P) не даст одно и то же для конечного параметра цикла?


В твоём конкретном случае - даст. В общем - нет.


> Согласен, нужно думать.


На самом деле тут всё просто.
Либо делаешь полностью универсальную процедуру, подаёшь в неё Connection, текст запроса и параметры.
Либо делаешь паблик-метод своего датамодуля и в нём уже используешь один и тот же TADOCommand. Т.е. просто текст запроса и параметры.
Либо (но этот вариант для D7 не прокатит) делаешь class helper для того же TADOCommand


 
Laguna ©   (2011-10-19 10:40) [41]

>Ega23

C ADO раньше практиковал применение. Сейчас хочу перейти на ADS. Вот что получилось в новом виде:


procedure OperFromTab(AC : TAdsConnection; St : String; const P : array of variant);
Var
 i : Integer;
begin
 with TADSQuery.Create(nil) do
  try
    ADSConnection := AC;
    ParamCheck := True;
    SQL.Text := St;
    if Length(P) <> 0 then
     for i := Low(P) to High(P) do
      Params[i].Value := P[i];
    ExecSQL;
  finally
    Free;
  end;
end;


Вопрос с Blob-полями остается открытым


 
Ega23 ©   (2011-10-19 10:47) [42]

Не знаю что такое ADS.

Но рекомендую внимательно посмотреть на TADSConnection. Вдруг у него уже есть аналог TADOConnection.Execute, но с параметрами?


 
OW ©   (2011-10-19 11:02) [43]


> Laguna ©   (19.10.11 10:40) [41]

ну вот, уже лучше, имхо


> Вопрос с Blob-полями остается открытым

да не совсем..
вечером посмотрю, надо понаписать и это дело, пригодится.

>> class helper для того же TADOCommand
Вот - вот :(

> для D7 не прокатит

это мне ИШ сказал еще, типа, хрень делаешь. Был бы хелпер - смысл был бы, а так - хрень. Но я не согласен :)
Удобно, если по мелочи более 2х раз подряд, например, идет.
От основной мысли не так отвлекает, не мозолит глаза реализация, сосредотачиваешься больше на логику. (хотя и 5-6 строк лишних - не такое уж отвлечение от мысли, но все равно)


 
Ega23 ©   (2011-10-19 11:06) [44]


> Удобно, если по мелочи более 2х раз подряд, например, идет.

Я всё равно предпочитаю на каждую команду свой TADOCommand держать. По крайней мере там, где параметры нужны.


> ну вот, уже лучше, имхо

Это да, гораздо лучше.
if Length(P) <> 0 then
    for i := Low(P) to High(P) do
     Params[i].Value := P[i];

Только вот это вот зачем? for i := 0 to Length(P) - 1
Если длина 0, то цикл просто ни разу не выполнится.


 
Laguna ©   (2011-10-19 11:17) [45]


> Не знаю что такое ADS.


http://www.sybase.com/products/databasemanagement/advantagedatabaseserver


> Только вот это вот зачем? for i := 0 to Length(P) - 1Если
> длина 0, то цикл просто ни разу не выполнится.


А если будет так for i := 0 to High(P) при Length(P)=0 тоже ведь не будет цикл ни разу срабатывать.

Я считаю что High(P) и Length(P) - 1 равнозначны.


 
Медвежонок Пятачок ©   (2011-10-19 11:20) [46]

for i := 0 to min(High(P),Parameters.Count) do


 
Ega23 ©   (2011-10-19 11:23) [47]


> Я считаю что High(P) и Length(P) - 1 равнозначны.


Нет.

procedure TForm19.Button2Click(Sender: TObject);
var
 arr: array[3..4] of Integer;
begin
 ShowMessage(IntToStr(Length(arr)));
 ShowMessage(IntToStr(High(arr)));
end;


 
OW ©   (2011-10-19 11:29) [48]

>>Только вот это вот зачем? for i := 0 to Length(P) - 1
не смотрел на это. так, в общем смотрел.

да что мудрить
for i := 0 to Parameters.Count - 1 do

не надо high | low смотреть. Ошибся - ССЗБ.
или, на крайняк, if длины <> then raise Exception.create("ССЗБ");


 
Laguna ©   (2011-10-19 11:37) [49]

>Ega23

Ну, как говорится, мастерство не пропьешь. Снимаю шляпу :)

Действительно, запустил тестовую строку без параметров

 OperFromTab(DM1.AdsConnection2, "DELETE FROM PriTab ", []);

и вот что получил
http://s017.radikal.ru/i433/1110/d9/d20e56fcfa34.jpg

Теперь я однозначно знаю, что правильным будет применение Length(P) - 1


 
Ega23 ©   (2011-10-19 11:45) [50]


> Теперь я однозначно знаю, что правильным будет применение
> Length(P) - 1


Нет не так. Либо Low to High, либо 0 to Length - 1


var
 arr: array of Integer;
begin
 SetLength(arr, 0);
 ShowMessage(IntToStr(Low(arr)));
 ShowMessage(IntToStr(High(arr)));

Т.е. 0 to -1 Значит ни разу не выполнится.


 
Омлет ©   (2011-10-19 11:47) [51]

> Я считаю что High(P) и Length(P) - 1 равнозначны.

Для дин.массивов равнозначны.


 
Laguna ©   (2011-10-19 11:58) [52]

Хм, немного поспешил. Ведь при отсутствии параметров Length(P) - 1 тоже вернет -1. Значит тоже, что и High(P).


 
Ega23 ©   (2011-10-19 12:04) [53]


> Хм, немного поспешил. Ведь при отсутствии параметров Length(P)
> - 1 тоже вернет -1. Значит тоже, что и High(P).


Ты либо от Low до High используй, либо от N до M. А вот скрещивать их лучше не стоит, можно наколоться здорово.


 
Laguna ©   (2011-10-19 12:15) [54]

ОК, еще вариант использую как Params.Count? но почему мне компилятор не дает посмотреть его значение в режиме отладки?

http://s51.radikal.ru/i134/1110/44/5d1cff8cf816.jpg


 
Медвежонок Пятачок ©   (2011-10-19 12:19) [55]

Потому что нет такого свойства Params


 
Ega23 ©   (2011-10-19 12:20) [56]


> ОК, еще вариант использую как Params.Count?


Да что-ж тебя на извращения-то так тянет?????


 
Laguna ©   (2011-10-19 12:27) [57]


> Потому что нет такого свойства Params

http://s017.radikal.ru/i443/1110/85/bdbf66b42509.jpg


> Да что-ж тебя на извращения-то так тянет?????

как вариант хотелось рассмотреть.
Все, останавливаюсь на for i := Low(P) to High(P) do


 
Ega23 ©   (2011-10-19 12:32) [58]


> Все, останавливаюсь на for i := Low(P) to High(P) do


Я бы на твоём месте остановился на варианте for i:=0 to Params.Count - 1 do


 
Laguna ©   (2011-10-19 12:41) [59]


> Ega23 ©   (19.10.11 12:20) [56]
> ОК, еще вариант использую как Params.Count?
>Да что-ж тебя на извращения-то так тянет?????


???


> Ega23 ©   (19.10.11 12:32) [58]
> > Все, останавливаюсь на for i := Low(P) to High(P) do
>Я бы на твоём месте остановился на варианте for i:=0 to Params.Count - 1 do


 
Ega23 ©   (2011-10-19 12:43) [60]


> >Да что-ж тебя на извращения-то так тянет?????
>
>
> ???


Pred(Params.Count)


 
Laguna ©   (2011-10-19 12:49) [61]


> Pred(Params.Count)


:))) у каждого свой стиль. Главное чтобы конечный результат был правильным.


 
Ega23 ©   (2011-10-19 12:57) [62]


>  у каждого свой стиль.


Плохой стиль. Не делай так.


 
Anatoly Podgoretsky ©   (2011-10-19 13:06) [63]

> Ega23  (19.10.2011 11:45:50)  [50]

Притом, первое идеологически вернее.


 
Laguna ©   (2011-10-19 13:10) [64]


> Плохой стиль. Не делай так.


Для этого есть серьезный аргумент?

6 = 7 -1 (Pred(7))
7 = 6 + 1(Succ(6))


 
Anatoly Podgoretsky ©   (2011-10-19 13:10) [65]


> Я бы на твоём месте остановился на варианте for i:=0 to
> Params.Count - 1 do

Тоже идеологически не верно, что будет если Low=10, а High=11
А вот Low to High всегда будет работать.


 
Anatoly Podgoretsky ©   (2011-10-19 13:12) [66]


>  with TADOQuery.Create(nil) do
>   try
>     ADOConnection := DM1.AdoConnection1;
>     ParamCheck := True;
>     SQL.Clear;
>     for i := 0 to High(P) do
>      Params[i].Value := P[i];

Как тогда прикажешь понимать, когда тебе говорят, что у ADO нет свойства Params, а ты все равно настаиваешью


 
Ega23 ©   (2011-10-19 13:15) [67]


> Тоже идеологически не верно, что будет если Low=10, а High=11


Ошибка будет. Ибо нефиг.
Зато параметры - уж точно все будут охвачены.
И, кстати, ошибка в обоих случаях будет.


 
Laguna ©   (2011-10-19 13:17) [68]


> Как тогда прикажешь понимать, когда тебе говорят, что у
> ADO нет свойства Params, а ты все равно настаиваешью


[41]


 
Laguna ©   (2011-10-19 13:23) [69]

Я думаю не стоит уж так все усложнять. Массив то формируется динамически. А так как порядок элементов массива всегда начинаются с 0, то логично , что

Low(P) - всегда будет 0,
а High(P) - количество элементов - 1

Так ведь?


 
Ega23 ©   (2011-10-19 13:36) [70]


> Так ведь?


Так. Только в одном случае ты пройдёшь по всем элементам массива, а в другом - по всем параметрам запроса.
Чуешь разницу?


 
OW ©   (2011-10-19 13:39) [71]

по идее - да

Мне понравился Lotus в этом плане. По умолчанию с 0, но можно переопределить, с любого индекса.
Хотя, что со скриптового языка взять, кроме анализов :)


 
Ega23 ©   (2011-10-19 13:44) [72]

Давайте уже закончим данную ветку, это становится невыносимым...


 
Laguna ©   (2011-10-19 13:49) [73]

Ок. Всем спасибо за помощь.



Страницы: 1 2 вся ветка

Текущий архив: 2012.01.29;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.007 c
2-1318932404
rammic
2011-10-18 14:06
2012.01.29
Как применить FindComponent на дочерних окнах


15-1318019402
Юрий
2011-10-08 00:30
2012.01.29
С днем рождения ! 8 октября 2011 суббота


3-1270836090
AlexJ
2010-04-09 22:01
2012.01.29
Не видны изменения при модификации через Edit ... Post


15-1318365002
Юрий
2011-10-12 00:30
2012.01.29
С днем рождения ! 12 октября 2011 среда


2-1318848285
pest
2011-10-17 14:44
2012.01.29
конфликт двух DLL при совместном использовании