Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.038 c
1-1122930722
Asteroid
2005-08-02 01:12
2005.08.21
Крыша едет с динмаическими массивами...


3-1121085353
Извращенец2
2005-07-11 16:35
2005.08.21
Курсоры в MSSQL


14-1122896571
Exchanger
2005-08-01 15:42
2005.08.21
Электроника, мебель, обмен ссылками, работа


14-1122575676
Alexander Panov
2005-07-28 22:34
2005.08.21
товарищъ с адреса 217.106.205.35, не надо так делать!


1-1123086872
TerminalHead
2005-08-03 20:34
2005.08.21
SC_HANDLE





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский