Форум: "Базы";
Текущий архив: 2005.08.21;
Скачать: [xml.tar.bz2];
ВнизИмена параметров Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.032 c