Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.21;
Скачать: CL | DM;

Вниз

Имена параметров   Найти похожие ветки 

 
wild_arg ©   (2005-07-11 09:58) [0]

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


 
evvcom ©   (2005-07-11 10:02) [1]

Компоненты доступа какие?


 
wild_arg ©   (2005-07-11 10:08) [2]

TADOConnection
через строку: Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=DBName;Data Source=ServerName


 
evvcom ©   (2005-07-11 10:13) [3]

ADO практически не пользую. В BDE в TStoredProc есть
type TParamBindMode = (pbByName, pbByNumber);
property ParamBindMode: TParamBindMode;
В ADO-компонентах я такого не увидел. Жди знающих...


 
stone ©   (2005-07-11 10:18) [4]

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


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

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

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

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

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


 
evvcom ©   (2005-07-11 10:39) [6]

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


 
Fay ©   (2005-07-11 11:16) [7]

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


 
evvcom ©   (2005-07-11 11:41) [8]


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

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


 
Fay ©   (2005-07-11 11:48) [9]

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


 
evvcom ©   (2005-07-11 11:56) [10]


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

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


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

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)


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

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


 
Anatoly Podgoretsky ©   (2005-07-12 08:53) [13]

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


 
wild_arg ©   (2005-07-12 09:54) [14]

Либо я чего-то не понимаю, либо одно из двух, но у меня ничего не выходит.
В 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 - таж фигня.


 
Ega23 ©   (2005-07-12 10:11) [15]


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 10:23) [16]

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


 
Ega23 ©   (2005-07-12 10:28) [17]

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


 
wild_arg ©   (2005-07-12 10:37) [18]

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


 
Ega23 ©   (2005-07-12 10:38) [19]

Незачто.


 
wild_arg ©   (2005-07-12 11:39) [20]

Получилась вот такая:
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;


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


 
wild_arg ©   (2005-07-12 11:41) [21]

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


 
Ega23 ©   (2005-07-12 11:50) [22]

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


 
wild_arg ©   (2005-07-12 13:37) [23]

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



Страницы: 1 вся ветка

Текущий архив: 2005.08.21;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.053 c
1-1122844342
ronyn
2005-08-01 01:12
2005.08.21
Срок работы DEMO


14-1122741224
TUser
2005-07-30 20:33
2005.08.21
Я скорее доверюсь Ивану с разводным ключом,


14-1122644916
Nick Denry
2005-07-29 17:48
2005.08.21
Народ, а как правильно создать


1-1122627071
MegaVolt
2005-07-29 12:51
2005.08.21
ListView+WinXP+GridLines+стрелочки вниз вверх=бяка :(


4-1120043290
Вт
2005-06-29 15:08
2005.08.21
Настройка экрана