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

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

Имена параметров [D7, MSSQL]


Страницы:   1 2

wild_arg ©   (2005-07-11 09:58:00) 

Есть в MS SQL хранимая процедура с кучей параметров, у каждого параметра определено значение по умолчанию, дабы при необходимости можно было бы передать только нужные.
Например, можно вызвать MyProc @p1=..., @p2=..., @p3=..., а можно MyProc @p3=...
В SQL Analyzer все работает.
В дельфи беру TADOQuery, указываю имя процедуры, создаю параметры, присваиваю имена...
Но, при выполнении запроса, почему-то значения параметров передаются не по именам, а по порядку!!!
Например, укажу Param.Name := '@p3'; Param.Value := <value>;
а значение это при выполнении передастся первому параметру.


wild_arg   (2005-07-12 13:37:00) [1]

да любые передавай, указывай только соответствующие типы в ParamTypes и все


Ega23   (2005-07-12 11:50:00) [2]

А зачем ты это всё наваял?
А как быть с datetime-параметрами? А с BLOB?
ИМХО, фигню ты какую-то написал...


wild_arg   (2005-07-12 11:41:00) [3]

блин, а вот эта строка sParam.Name     := NamesParams[I];совсем не нужна :) осталась от пред. версии, хотя и не мешает


wild_arg   (2005-07-12 11:39:00) [4]

Получилась вот такая:
function spOpenPNEx (dbConn: TADOConnection; ProcName : String;
 const NamesParams : array of String; const Params : array of Variant;
 const ParamTypes : array of TFieldType) : TADOQuery;
var I, vL, vH : Integer;
   sParam : TParameter;
   S: string;
begin
vL := Low (Params);
vH := High(Params);
Result := TADOQuery.Create(nil);
Result.Connection := dbConn;
S := NamesParams[0]+'=:'+Copy(NamesParams[0],2,MaxInt);
for I := vL+1 to vH do
  S := S+', '+NamesParams[I]+'=:'+Copy(NamesParams[I],2,MaxInt);
Result.SQL.Text := 'exec '+ProcName+' '+S;
for I := vL to vH do begin
  sParam := Result.Parameters.ParamByName(Copy(NamesParams[I],2,MaxInt));
  sParam.Name     := NamesParams[I];
  sParam.DataType := ParamTypes[I];
  sParam.Value    := Params[I];
end;
try
  Result.Open;
except
  Result.Free;
  raise;
end;
end;


ну и вызов, например:
with spOpenPNEx(dbConn, 'lib_spSpecification_AttrUPDATE', ['@AID','@ANote'],
   [CurrentSpecID, ANote], [ftInteger, ftString]) do Free;


Пришлось типы передавать, а то при некоторых ругался матом :) но это не страшно, главное работает


Ega23   (2005-07-12 10:38:00) [5]

Незачто.


wild_arg   (2005-07-12 10:37:00) [6]

блин, я тож просмотрел :)
да, так работает.
теперь осталось написать универсальную функцию, думаю все получится.
Спасибо.


Ega23   (2005-07-12 10:28:00) [7]

Тьфу, забыл:
После строчки
Connection:=ADOConnection1;
Надо поставить
SQL:=ss;


wild_arg   (2005-07-12 10:23:00) [8]

не, не работает, кричит, что параметр Par2 не найден. Добавление строки aq.Parameters.ParseSQL(ss,True)не помогает


Ega23   (2005-07-12 10:11:00) [9]


var
ss:string;
aq:TADOQuery;
begin
ss:='exec Test @par2=:Par2';
aq:TADOQuery.Create(nil);
With aq do
 begin
  try
   Connection:=ADOConnection1;
   ParamByName('Par2').Value:=5;
   try
    Open;
    ShowMessage(FieldByName('par1').AsString+'#'+FieldByName('par2').AsString+'#'+FieldByName('par3').AsString);
   except
    ShowMessage('Can't open');
   end;
  finally
   Free;
  end;
end;


Попробуй так, о результатах - сообщи.


wild_arg   (2005-07-12 09:54:00) [10]

Либо я чего-то не понимаю, либо одно из двух, но у меня ничего не выходит.
В MS SQL есть у меня ХП
CREATE PROCEDURE
test
 @par1 int = null,
 @par2 int = null,
 @par3 int = null
AS

select
isNull(@par1,-1) par1, isNull(@par2,-1) par2, isNull(@par3,-1) par3


Из делфи ее вызываю
var q: TADOStoredProc;
begin
 q := TADOStoredProc.Create(Application);
 q.Connection := ADOConnection1;
 q.ProcedureName := 'Test';
 with q.Parameters.AddParameter do
   Name := '@par2';
 q.Parameters.ParamByName('@par2').Value := 5;
 q.Open;
 ShowMessage(q.FieldByName('par1').AsString+'#'+q.FieldByName('par2').AsString+'#'+q.FieldByName('par3').AsString);
 q.Free;
end;

Но, вместо того чтобы вернуть мне строку '-1#5#-1', я получаю '5#-1#-1'

Здесь говорили про ParamCheck, но у TADOStoredProc такого свойства нет, а у TADOQuery нет свойства ProcedureName( :) вот уж воистину: либо дудочка, либо кувшинчик). Пробовал совать имя процедуры в ADOQuery.SQL.Text - таж фигня.


Anatoly Podgoretsky   (2005-07-12 08:53:00) [11]

А чего ему быть плохим, если он наследован от TADODataSet и добавлено пару свойств и методов.


Polevi   (2005-07-12 08:48:00) [12]

>evvcom ©   (11.07.05 11:56) [10]
TADOQuery хороший, не обижай


Fay   (2005-07-11 14:03:00) [13]

2 evvcom ©   (11.07.05 11:56) [10]
published
   property CommandText;
   property CommandTimeout;
   property CommandType;
   property DataSetField;
   property DataSource;
   property EnableBCD;
   property FieldDefs;
   property IndexName;
   property IndexFieldNames;
   property MasterFields;
   property ParamCheck;
   property Parameters;
   property Prepared;
   property RDSConnection: TRDSConnection read FRDSConnection write SetRDSConnection;
   property StoreDefs;
   property BeforeOpen;
   property AfterOpen;
   property BeforeClose;
   property AfterClose;
   property BeforeInsert;
   property AfterInsert;
   property BeforeEdit;
   property AfterEdit;
   property BeforePost;
   property AfterPost;
   property BeforeCancel;
   property AfterCancel;
   property BeforeDelete;
   property AfterDelete;
   property BeforeScroll;
   property AfterScroll;
   property OnCalcFields;
   property OnDeleteError;
   property OnEditError;
   property OnNewRecord;
   property OnPostError;
  end;

Без этого никак нельзя выполнитьт ХП ? 8)


evvcom   (2005-07-11 11:56:00) [14]


> Fay ©   (11.07.05 11:48) [9]

В связи с "закрытостью" многих свойств/методов в сравнении с TADODataSet другие ADO-компоненты более ограничены/не удобны в использовании. Я выразил мнение мастеров во время их отсутствия в данное время на форуме, сам яро защищать эту идею не собираюсь, так как через ADO практически не работаю.


Fay   (2005-07-11 11:48:00) [15]

2 evvcom ©   (11.07.05 11:41) [8]
Кто кому мешает? Я этого не говорил и не писал.
Прочтите [7] внимательно.


evvcom   (2005-07-11 11:41:00) [16]


> Глядя на исходники, трудно сделать соотв. таким советам
> выводы

И чего же там такого в исходниках, что не позволяет использовать TADODataSet для аналогичных целей?


Fay   (2005-07-11 11:16:00) [17]

2 evvcom ©   (11.07.05 10:39) [6]
Странные советы. Глядя на исходники, трудно сделать соотв. таким советам выводы.


evvcom   (2005-07-11 10:39:00) [18]

Мастера ADO советуют не пользоваться кастратами TADOStoredProc, TADOQuery и проч., а пользовать во всех случаях TADODataSet


Ищущий   (2005-07-11 10:34:00) [19]

вопрос:  "указываю имя процедуры, создаю параметры, присваиваю имена" - попытка из ADOQuery создать ХП;

Если проседура есть на сервере, то
(adostoredproc уже настроен на процедуру)

ADOStoredProc1.Parameters.ParamByName('').Value:=

желательно настроить тип данных в параметре и данные передавать обрезая trimom пробелы.


stone   (2005-07-11 10:18:00) [20]

TADOQuery.ParamCheck = true
Все параметры создадуться автоматически
Далее просто присвой им значения через ParamByName


Страницы:   1 2

Наверх

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