Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Назначение параметров в ADO, как правильно?


Страницы:   1 2

Kolan ©   (2007-12-26 14:13:00) 

Здравтсвуйте,
 У меня есть ADODataSet, правильно ли я назначаю параметр:
DataSet.Parameters.FindParam('LPUID').Value := ALPUID;
?


sniknik   (2007-12-26 16:30:00) [1]

> Но тоже варик не из лучших… много лишнего…
это у тебя много лишнего, а правильное лишним не бывает.

вот кстати зачем предварительные сравнения :LPUID = '', у тебя есть null-ы в полях? но судя по всему не нужны. поставь полю дефаултное значение '', и убери эту проверку т.к. если параметр пустая строка то второе сравнение будет LIKE с '%' что само по себе значение "любая строка"... ну кроме null, естественно.
вот это лишнее (т.е. то что ничего не изменит если убрать).  

> Что-то я не понял о чем речь…
когда добьешся "рабочести" запроса, просто убери везде Upper, изменилось чтонибудь? врядли. т.к. по умолчанию ставился коллатион xxxx_CI (case insensitive - игнорирование регистра)

вот это кстати получается тоже лишнее, да еше и мешающее, если ктото вдруг задумает изменить общее поведение сервера.
а ты о какихто 2х введенных переменных переживаешь (оправданно введенных!)...


Kolan   (2007-12-26 16:03:00) [2]

> Anatoly Podgoretsky

Ясно… :)

Пойду тогда читать :)


Anatoly Podgoretsky   (2007-12-26 16:01:00) [3]

Склейку убрать, UPPER убрать, параметры являются не параметрами, а place holder
Или разные имена или проход по списку параметров.
Обратить внимание на Server Collation
Главное - читать книги, там есть ответы, а вот если нет, то сюда.


Kolan   (2007-12-26 15:56:00) [4]

> Если это весь код, то неправильно, ALPUID не инициализирован
> и вообще неизвестен.

function TPeriodDataAccessFacade.SelectLPUList(const ALPUName, ALPUID: string): TDataSet;
var
 DataSet: TADODataSet;
begin
 DataSet := TADODataSet.Create(nil);
 DataSet.Connection := DBConnection;
 DataSet.CommandText :=
 'SELECT NMLPU, CDLPU, CDLPU_U'+#13#10
 +'FROM SLLPU'+#13#10
 +'WHERE'+#13#10
       +'((:LPUID = '''') OR (Upper(CDLPU_U) LIKE Upper(:LPUID)+''%''))'+#13#10
   +'AND ((:LPUName = '''') OR (Upper(NMLPU) LIKE Upper(:LPUName)+''%''))'+#13#10
 +'ORDER BY NMLPU';
 DataSet.Parameters.ParamByName('LPUID').Value := ALPUID;
 DataSet.Parameters.ParamByName('LPUName').Value := ALPUName;
 DataSet.Open;
 Result := DataSet;
end;  


Вот весь код. в сабже передавал пустые строки (ALPUName = '')и (ALPUID = '').


Anatoly Podgoretsky   (2007-12-26 15:56:00) [5]


> В BDE работао…

Не верно, в ранних не работало, просто Борланд в старших встроил защиту от ламеров.


Kolan   (2007-12-26 15:53:00) [6]

> Правильно анализировать результаты поиска.

Даваольно пративно выходит занятие, проже «склеивать» строки…


> проигнорированное…

Шас попробую. Но тоже варик не из лучших… много лишнего…


> этих самых «коллатионов»,

Что-то я не понял о чем речь…


Anatoly Podgoretsky   (2007-12-26 15:53:00) [7]

> Kolan  (26.12.2007 14:19:04)  [4]

Если это весь код, то неправильно, ALPUID не инициализирован и вообще неизвестен.


sniknik   (2007-12-26 15:50:00) [8]

> Мож ему не нравится два раза :LPUName…
ему не нравится все, что "два раза".
и вообще решение в > clickmaker ©   (26.12.07 15:09) [13], проигнорированное...

только я бы еще Upper(:хххх) для параметров убрал бы... нафига в запрос пихать "полуфабрикат"? сервер поднапрячь хоть еще чуть чуть?
плюс, в MSSQL размерами букв (сравнениями в различных регистрах) занимаются "колатионы"... т.е. по правильному все Upper у тебя в запросе лишние... поведение делается настройкой этих самых "коллатионов", у тебя же в одном случае, при совпадении Upper будет дублировать действия, в другом просто менять настроенное поведение (а ну я хочу с регистрами, настроил, сделал апдейт базе и .... ?).


Anatoly Podgoretsky   (2007-12-26 15:50:00) [9]

> Kolan  (26.12.2007 14:13:00)  [0]

Нет
Правильно анализировать результаты поиска.


Kolan   (2007-12-26 15:29:00) [10]

> Аксес

Нет, мс скьюэль сервер.


> Может, лучше все-таки (@LPUID = '''')?

Да, точно, просто раньше запрос был в компоненте, отсюда ошибки…

Получается так:
'SELECT NMLPU, CDLPU, CDLPU_U'#$D#$A'FROM SLLPU'#$D#$A'WHERE'#$D#$A'((:LPUID = '') OR (Upper(CDLPU_U) LIKE Upper(:LPUID)+'%'))'#$D#$A'AND ((:LPUName = '') OR (Upper(NMLPU) LIKE Upper(:LPUName)+'%'))'#$D#$A'ORDER BY NMLPU'

Грит что: «Неправильно определено объект Parameter. Переданы не совместимые или не полные свединия»

Мож ему не нравится два раза :LPUName…


Правильный_Вася   (2007-12-26 15:25:00) [11]

процент ставь внутрь параметра, а не притуливай к нему


DrPass   (2007-12-26 15:16:00) [12]


> ((@LPUID = '')

Может, лучше все-таки (@LPUID = '''')?
А то вы знаете, два рядом стоящих апострофа в строковой константе в Delphi - это не просто два рядом стоящих апострофа :)

Опять же таки, если СУБД - Аксес, то там то, что у людей обозначается %, надо обозначать *


clickmaker   (2007-12-26 15:09:00) [13]


> [11] Kolan ©   (26.12.07 15:00)

DataSet.CommandText :=
'DECLARE @LPUID varchar(50)' + #13#10 +
'DECLARE @LPUName varchar(50)' + #13#10 +
'SET @LPUID = Upper(:LPUID), @LPUName = Upper(:LPUName)' + #13#10 +
'SELECT NMLPU, CDLPU, CDLPU_U'+#13#10
+'FROM SLLPU'+#13#10
+'WHERE'+#13#10
      +'((@LPUID = '') OR (Upper(CDLPU_U) LIKE @LPUID+''%''))'+#13#10
  +'AND ((@LPUName = '') OR (Upper(NMLPU) LIKE @LPUName+''%''))'+#13#10
+'ORDER BY NMLPU';
DataSet.Parameters.FindParam('LPUID').Value := ALPUID;
DataSet.Parameters.FindParam('LPUName').Value := ALPUName;


Ega23   (2007-12-26 15:05:00) [14]


> Можно и подставить в текст, интересно же разобраться… Кроме
> того подставить можно и в других случисях, но зачем-то же
> придумали параметры…


Зачем их придумали - как раз понятно.
Неясно другое: нафига их использовать в данном конкретном случае?
Master-Detail связки у тебя, вроде, нет, Prepare я тоже не вижу...


Kolan   (2007-12-26 15:00:00) [15]

> А почему сразу подставить в текст нельзя? Лично я большого
> смысла в параметрах в данном конкретном случае не вижу.

Можно и подставить в текст, интересно же разобраться… Кроме того подставить можно и в других случисях, но зачем-то же придумали параметры…


Ega23   (2007-12-26 14:57:00) [16]


> а как без неё. условие такое…
>


А почему сразу подставить в текст нельзя? Лично я большого смысла в параметрах в данном конкретном случае не вижу.


Kolan   (2007-12-26 14:53:00) [17]

> мне не разрешали использовать одно и тоже имя

В BDE работао…


> вот эта штучка по моему мешает…

а как без неё. условие такое…


Palladin   (2007-12-26 14:39:00) [18]

((:LPUID = '')

вот эта штучка по моему мешает... на нее и ругается, это первое, второе насколько я помню, мне не разрешали использовать одно и тоже имя параметра дважды использовать в запросе


Kolan   (2007-12-26 14:30:00) [19]

> ParamByName

DataSet.Parameters.ParamByName('LPUID').Value
Так, тут разве не будет тойже проблемы при nil параметре…

Результат тот же…


clickmaker   (2007-12-26 14:25:00) [20]


> Operator equals modulo

он принял ''%'' за операцию взятия модуля, что-ли?
и, думаю, правильней ParamByName, потому что ты не проверяешь возврат, а у FindParam он может быть nil, тогда как 1-я выбросит исключение


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо