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

Вниз

из Delphi получить все параметры процедуры MsSql-сервера   Найти похожие ветки 

 
Nilov Serge   (2005-08-11 12:24) [0]

Поскажите, пожалуйста. Есть необходимость из Delphi по имени процедуры MsSql-сервера получить все параметры процедуры.
Делаю:

 spGlobal: TADOStoredProc;
begin
 spGlobal := TADOStoredProc.Create(nil);
 try
   spGlobal.ProcedureName := "userpublish.pmi_Codes"; // Имя СУЩЕСТВУЮЩЕЙ процедуры
   spGlobal.Connection := MyConnection; // Обьект коннекта
   spGlobal.Prepared := True;
   ShowMessage( IntToStr(spGlobal.Parameters.Count) ); // Получаю 0
и массив spGlobal.Parameters пустой! В чем может быть проблема? Процедуру задавал в виде
"pmi_Codes", "[userpublish].[pmi_Codes]" - результат тотже. Правда и если задаю имя
несуществующей процедуры результат тотже. Конектюсь под "userpublish". Delphi 6 (Build 6.163).
А как правильно?
 С уважением,
   Нилов Сергей.


 
Nikolay M. ©   (2005-08-11 13:09) [1]

Недокументированная хранимка спасет отца русской демократии?

EXEC sp_procedure_params_rowset "моя процедура"


 
sniknik ©   (2005-08-11 13:10) [2]

правильно (документировано ;).
см. ADOConnection.OpenSchema и siProcedureParameters + F1 ;о)
(я бы помог, это всетаки довольно сложно (относительно конечно), но вот именно по параметрам у меня ничего нет, не приходилось... а в инете найти... сам сможеш с тем же успехом)

как OpenSchema работает (принцип) можеш посмотреть в ADODB.ADOConnection.GetTableNames к примеру.


 
Nilov Serge   (2005-08-11 15:11) [3]

Спасибо, "EXEC sp_procedure_params_rowset "моя процедура"" - дешево и сердито и то что надо для спасения "отца русской демократии".
 С уважением,
   Нилов Сергей.


 
Nikolay M. ©   (2005-08-11 15:53) [4]

Пыж. Обращайтесь :)


 
AlexWlad ©   (2005-08-11 20:05) [5]

SP_Any - некая СП
Q_SP_par - временный Query


procedure TDM_ArchVisa.prReadSPparam(base, name: String);
Var
  i : Integer;
begin
    SP_Any.Parameters.Clear;

    Q_SP_par.SQL.Clear;
    Q_SP_par.SQL.Add("exec "+base+"..sp_procedure_params_rowset """+
                     name+
                     """, 1, NULL, NULL");
    Q_SP_par.Open;
    Q_SP_par.First;
    while not Q_SP_par.eof do
    begin
         SP_Any.Parameters.AddParameter;
         i := SP_Any.Parameters.Count-1;
         if Q_SP_parIS_NULLABLE.AsBoolean then
            SP_Any.Parameters.Items[i].Attributes := [paNullable];
         case Q_SP_parDATA_TYPE.AsInteger of
            2: begin   // smallint
                    SP_Any.Parameters.Items[i].DataType  := ftSmallInt;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
            3: begin   // integer
                    SP_Any.Parameters.Items[i].DataType  := ftInteger;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
         4..5: begin    // real, float
                    SP_Any.Parameters.Items[i].DataType  := ftFloat;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
        6,131: begin   // money,smallmoney, decimal,numeric
                    SP_Any.Parameters.Items[i].DataType  := ftBCD;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
           11: begin   // bit
                    SP_Any.Parameters.Items[i].DataType  := ftBoolean;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
           17: begin   // tinyint
                    SP_Any.Parameters.Items[i].DataType  := ftWord;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
           20: begin   // bigint
                    SP_Any.Parameters.Items[i].DataType  := ftLargeInt;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
           72: begin   // uniqueidentifier
                    SP_Any.Parameters.Items[i].DataType  := ftGuid;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
          128: begin   // binary,varbinary,image
                    SP_Any.Parameters.Items[i].DataType  := ftVarBytes;
                    SP_Any.Parameters.Items[i].Precision := Q_SP_parNUMERIC_PRECISION.AsInteger;
               end;
          129: begin   // char,varchar,text
                    SP_Any.Parameters.Items[i].DataType := ftString;
                    SP_Any.Parameters.Items[i].Size     := Q_SP_parCHARACTER_MAXIMUM_LENGTH.AsInteger;
               end;
          135:         // datetime,smalldatetime
                    SP_Any.Parameters.Items[i].DataType := ftDateTime;
         end;
         case Q_SP_parPARAMETER_TYPE.AsInteger of
            1: SP_Any.Parameters.Items[i].Direction := pdInput;
            2: SP_Any.Parameters.Items[i].Direction := pdInputOutput;
            4: SP_Any.Parameters.Items[i].Direction := pdReturnValue;
         end;
         SP_Any.Parameters.Items[i].Name := Q_SP_parPARAMETER_NAME.AsString;
         Q_SP_par.Next;
    end;
    Q_SP_par.Close;
end;



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

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

Наверх




Память: 0.49 MB
Время: 0.025 c
2-1124096978
СержК
2005-08-15 13:09
2005.09.25
Нужно что-то типа: "TimeToStr" ...


2-1124355965
Гость22
2005-08-18 13:06
2005.09.25
Как в поле DBLookupComboBox1 уствновить необходимое ...


14-1125988244
ilya39
2005-09-06 10:30
2005.09.25
http://msdn.microsoft.com/library/rus/


2-1124197843
PIF
2005-08-16 17:10
2005.09.25
Разделитель между целой и дробной частью числа


3-1123651386
serjufa
2005-08-10 09:23
2005.09.25
вылезает ошибка при выполнении SELECT