Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


Nilov Serge ©   (2005-08-11 12:24:00) 

Поскажите, пожалуйста. Есть необходимость из 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).
А как правильно?
 С уважением,
   Нилов Сергей.


AlexWlad   (2005-08-11 20:05:00) [1]

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;


Nikolay M.   (2005-08-11 15:53:00) [2]

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


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

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


sniknik   (2005-08-11 13:10:00) [4]

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

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


Nikolay M.   (2005-08-11 13:09:00) [5]

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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо