Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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 параметре&#133

Результат тот же&#133


 
Palladin ©   (2007-12-26 14:39) [8]

((:LPUID = "")

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


 
Kolan ©   (2007-12-26 14:53) [9]

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

В BDE работао&#133


> вот эта штучка по моему мешает&#133

а как без неё. условие такое&#133


 
Ega23 ©   (2007-12-26 14:57) [10]


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


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


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

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

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


 
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 = """")?

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

Получается так:
"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&#133


 
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]

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

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


> проигнорированное&#133

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


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

Что-то я не понял о чем речь&#133


 
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

Ясно&#133 :)

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


 
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
2-1199220887
DmT
2008-01-01 23:54
2008.01.27
Как получить доступ на чтение к переменной из другого юнита?


15-1198133256
Ega23
2007-12-20 09:47
2008.01.27
Я вернулся.


2-1198733905
Dana
2007-12-27 08:38
2008.01.27
Пароль для таблиц *.db


15-1197963583
Slider007
2007-12-18 10:39
2008.01.27
С днем рождения ! 18 декабря 2007 вторник


6-1179202437
apic
2007-05-15 08:13
2008.01.27
RPC