![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Назначение параметров в ADO, как правильно?
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-я выбросит исключение