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