Текущий архив: 2008.01.27;
Скачать: CL | DM;
Вниз
Назначение параметров в ADO, как правильно? Найти похожие ветки
← →
Kolan © (2007-12-26 14:13) [0]Здравтсвуйте,
У меня есть ADODataSet, правильно ли я назначаю параметр:DataSet.Parameters.FindParam("LPUID").Value := ALPUID;
?
← →
Palladin © (2007-12-26 14:14) [1]да
← →
clickmaker © (2007-12-26 14:15) [2]а не работает, что-ли?
это GUID?
← →
Ega23 © (2007-12-26 14:18) [3]Обрати внимание
FindParam
Note: FindParam operates with the name of a parameter as it appears in an SQL statement or stored procedure, not the Name property of a TParameter object. The two ways of referring to a parameter should not be confused.
ParamByName
Note: ParamByName operates with the name of a parameter as it appears in an SQL statement or stored procedure, not the Name property of a TParameter object. The two ways of referring to a parameter should not be confused.
← →
Kolan © (2007-12-26 14:19) [4]> а не работает, что-ли?
Неа, грит:Invalid operator for data type. Operator equals modulo, type equals varchar.
Вот весь код: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.FindParam("LPUID").Value := ALPUID;
DataSet.Parameters.FindParam("LPUName").Value := ALPUName;
DataSet.Open;
Result := DataSet;
end;
если убрать параметры из запроса и подставить "", то работает.
← →
Kolan © (2007-12-26 14:21) [5]
> это GUID?
Нет, это непередаваемая игра слов:
LPU — лечебно профилактическое уреждение. ID — Identifier
← →
clickmaker © (2007-12-26 14:25) [6]
> Operator equals modulo
он принял ""%"" за операцию взятия модуля, что-ли?
и, думаю, правильней ParamByName, потому что ты не проверяешь возврат, а у FindParam он может быть nil, тогда как 1-я выбросит исключение
← →
Kolan © (2007-12-26 14:30) [7]> ParamByName
DataSet.Parameters.ParamByName("LPUID").Value
Так, тут разве не будет тойже проблемы при nil параметре…
Результат тот же…
← →
Palladin © (2007-12-26 14:39) [8]((:LPUID = "")
вот эта штучка по моему мешает... на нее и ругается, это первое, второе насколько я помню, мне не разрешали использовать одно и тоже имя параметра дважды использовать в запросе
← →
Kolan © (2007-12-26 14:53) [9]> мне не разрешали использовать одно и тоже имя
В BDE работао…
> вот эта штучка по моему мешает…
а как без неё. условие такое…
← →
Ega23 © (2007-12-26 14:57) [10]
> а как без неё. условие такое…
>
А почему сразу подставить в текст нельзя? Лично я большого смысла в параметрах в данном конкретном случае не вижу.
← →
Kolan © (2007-12-26 15:00) [11]> А почему сразу подставить в текст нельзя? Лично я большого
> смысла в параметрах в данном конкретном случае не вижу.
Можно и подставить в текст, интересно же разобраться… Кроме того подставить можно и в других случисях, но зачем-то же придумали параметры…
← →
Ega23 © (2007-12-26 15:05) [12]
> Можно и подставить в текст, интересно же разобраться… Кроме
> того подставить можно и в других случисях, но зачем-то же
> придумали параметры…
Зачем их придумали - как раз понятно.
Неясно другое: нафига их использовать в данном конкретном случае?
Master-Detail связки у тебя, вроде, нет, Prepare я тоже не вижу...
← →
clickmaker © (2007-12-26 15:09) [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;
← →
DrPass © (2007-12-26 15:16) [14]
> ((@LPUID = "")
Может, лучше все-таки (@LPUID = """")?
А то вы знаете, два рядом стоящих апострофа в строковой константе в Delphi - это не просто два рядом стоящих апострофа :)
Опять же таки, если СУБД - Аксес, то там то, что у людей обозначается %, надо обозначать *
← →
Правильный_Вася (2007-12-26 15:25) [15]процент ставь внутрь параметра, а не притуливай к нему
← →
Kolan © (2007-12-26 15:29) [16]> Аксес
Нет, мс скьюэль сервер.
> Может, лучше все-таки (@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…
← →
Anatoly Podgoretsky © (2007-12-26 15:50) [17]> Kolan (26.12.2007 14:13:00) [0]
Нет
Правильно анализировать результаты поиска.
← →
sniknik © (2007-12-26 15:50) [18]> Мож ему не нравится два раза :LPUName…
ему не нравится все, что "два раза".
и вообще решение в > clickmaker © (26.12.07 15:09) [13], проигнорированное...
только я бы еще Upper(:хххх) для параметров убрал бы... нафига в запрос пихать "полуфабрикат"? сервер поднапрячь хоть еще чуть чуть?
плюс, в MSSQL размерами букв (сравнениями в различных регистрах) занимаются "колатионы"... т.е. по правильному все Upper у тебя в запросе лишние... поведение делается настройкой этих самых "коллатионов", у тебя же в одном случае, при совпадении Upper будет дублировать действия, в другом просто менять настроенное поведение (а ну я хочу с регистрами, настроил, сделал апдейт базе и .... ?).
← →
Anatoly Podgoretsky © (2007-12-26 15:53) [19]> Kolan (26.12.2007 14:19:04) [4]
Если это весь код, то неправильно, ALPUID не инициализирован и вообще неизвестен.
← →
Kolan © (2007-12-26 15:53) [20]> Правильно анализировать результаты поиска.
Даваольно пративно выходит занятие, проже «склеивать» строки…
> проигнорированное…
Шас попробую. Но тоже варик не из лучших… много лишнего…
> этих самых «коллатионов»,
Что-то я не понял о чем речь…
← →
Anatoly Podgoretsky © (2007-12-26 15:56) [21]
> В BDE работао…
Не верно, в ранних не работало, просто Борланд в старших встроил защиту от ламеров.
← →
Kolan © (2007-12-26 15:56) [22]> Если это весь код, то неправильно, 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 16:01) [23]Склейку убрать, UPPER убрать, параметры являются не параметрами, а place holder
Или разные имена или проход по списку параметров.
Обратить внимание на Server Collation
Главное - читать книги, там есть ответы, а вот если нет, то сюда.
← →
Kolan © (2007-12-26 16:03) [24]> Anatoly Podgoretsky
Ясно… :)
Пойду тогда читать :)
← →
sniknik © (2007-12-26 16:30) [25]> Но тоже варик не из лучших… много лишнего…
это у тебя много лишнего, а правильное лишним не бывает.
вот кстати зачем предварительные сравнения :LPUID = "", у тебя есть null-ы в полях? но судя по всему не нужны. поставь полю дефаултное значение "", и убери эту проверку т.к. если параметр пустая строка то второе сравнение будет LIKE с "%" что само по себе значение "любая строка"... ну кроме null, естественно.
вот это лишнее (т.е. то что ничего не изменит если убрать).
> Что-то я не понял о чем речь…
когда добьешся "рабочести" запроса, просто убери везде Upper, изменилось чтонибудь? врядли. т.к. по умолчанию ставился коллатион xxxx_CI (case insensitive - игнорирование регистра)
вот это кстати получается тоже лишнее, да еше и мешающее, если ктото вдруг задумает изменить общее поведение сервера.
а ты о какихто 2х введенных переменных переживаешь (оправданно введенных!)...
Страницы: 1 вся ветка
Текущий архив: 2008.01.27;
Скачать: CL | DM;
Память: 0.54 MB
Время: 0.013 c