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

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

TADOCommand + MSSQL + SP [D7, MSSQL]


Страницы:   1 2

Барра Кабамма ©   (2008-11-10 15:01:00) 

Помогите понять магию и логику адо при выполнении хранимок на mssql. Исходные данные:
хранимая на сервере, три входных параметра, шесть выходных.
Сама процедура отлажена и возвращает то что нужно. Кроме того, прекрасно выполняется из под asp.net и других хранимых процедур на самом сервере.
В Д7 вызываю так:

with TADOCommand.Create(Self) do
 try
  Connection  := ADOConnection;
  CommandType := cmdStoredProc;
  CommandText := 'my_procedure';
  with Parameters.AddParameter do
   begin
    Direction := pdReturnValue;
    DataType  := ftInteger;
    Name      := '@return_value';
   end;
  with Parameters.AddParameter do
   begin
    Direction := pdInput;
    DataType  := ftString;
    Size      := 20;
    Name      := '@p_cnt_num';
    Value      := ...
   end;
 ....
  with Parameters.AddParameter do
   begin
    Direction := pdInputOutput;
    DataType  := ftFloat;
    Name      := '@p_oborot_db';
   end;

Execute;

А дальше все зависит от фаз луны.

Может ругнуться на то, что ожидается параметр '@p_oborot_db который не определен.
Может ни на что не ругнуться но в половине выходных параметрах будут верные данные, в остальных либо пусто, либо неверные данные.

Если настроить ADoCommand в дизайне, то все работает как надо. Но мне необходимо создавать экземпляр динамически, или по крайней мере менять имя владельца в имени процедуры на рантайме (БД на разных серверах по разному называется), а при этом параметры установаленные в дизайнтайме говорят мне "привет".


sniknik   (2008-11-10 22:37:00) [1]

> Кроме того в 20 посте было
и там же было ParamCount, про что в [31] писал.

> собственно есть выбор из трех альтернатив:
4х
> [31] но это кстати не объясняет почему создание этих параметров у тебя не работает.
самостоятельное создание параметров тоже должно работать, всего то убрать из "неправильного" кода в [0] глюки (раз уж "правильный" не подходит) и все.


Барра Кабамма   (2008-11-10 21:43:00) [2]

в общем ладно, проехали.
меня щас больше интересует как выйти из положения малой кровью.
базы, которые названы по разному это объективная реальность и наследие прошлого. от этого уже никуда не деться.
собственно есть выбор из трех альтернатив:
1. перетащить все объекты дефолтной бд в те разноименные экземпляры
2. использовать еще один коннект в приложении.
3. перенести процедуры в дефолтную бд и использовать там динамический sql (вообще не прикалывает такая перспектива)


Барра Кабамма   (2008-11-10 21:30:00) [3]

Про разные базы было в самом вопросе.

Кроме того в 20 посте было
CommandText := Format('%s.dbo.GET_ACCOUNT_SALDO',[fDB]);


sniknik   (2008-11-10 19:27:00) [4]

> ты же не дал этой инфы "задним числом".
и даже больше того, ты это скрывал, и фальсифицировал пример
> CommandText := 'my_procedure';
где здесь ' xxx.xxx.my_procedure';??? показано как к родной.


sniknik   (2008-11-10 19:22:00) [5]

> ЗЫ тока не надо щас задним числом говорить, что вы это и так знали.
не знали конечно, ты же не дал этой инфы "задним числом".

то что ты сказал, это  
> БД на разных серверах по разному называется
т.е. это понятно (имхо) - работаешь с одним сервером коннектишся к базе с одним именем, с другим к с другим.
а то что у тебя, из коннекта к одной базе вызывается процедура из другой, а в этой этой процедуры совсем нет... не говорил такого.
можно было бы по [20] догадаться, так сказать протелепатировать зачем ты там форматом в имя базы значение какой то переменной вставляешь... но извини, я как ParamCount увидел так офигел и больше не  думал на эту тему.

но это кстати не объясняет почему создание этих параметров у тебя не работает.


Барра Кабамма   (2008-11-10 18:01:00) [6]

В общем слушайте опытные дивелоперы (у которых все и всегда и везде работает) и пополняйте свой небогатый жизненный опыт.

Я в начале говорил, что процедура моя самая обычная, но находится в разноименныхбд на разных серверах.
А само приложение коннектится всегда к своей служебной БД и у него всегда есть гранты на объекты второй бд, которая везде по разному зовется.
Так вот.
Рефреш говорит правду только если хранимка находится в текущей базе, а если имя ей дать dbname.dbo.procedurename и сделать рефрешь, то получается тот самый эффект, который меня и всех вас поставил в тупик.

делюсь бесплатно. потому как я сегодня добрый.

ЗЫ тока не надо щас задним числом говорить, что вы это и так знали.


Барра Кабамма   (2008-11-10 17:31:00) [7]

И еще вдобавок при execute злобные марсиане мне в лог вставляют: expects parameter '@p_cnt_num', which was not supplied


Барра Кабамма   (2008-11-10 17:28:00) [8]

значит в твоей процедуре ПАРАМЕТРОВ НЕТ, даже @RETURN_VALUE, что както уже загадочно...

Ага. А асп.нет приложение с SqlCommand читает их из космоса.


Барра Кабамма   (2008-11-10 17:27:00) [9]

А рефреш что с ;1 что без нее возвращает false


sniknik   (2008-11-10 17:26:00) [10]

> Parameters.Count нулевой
значит в твоей процедуре ПАРАМЕТРОВ НЕТ, даже @RETURN_VALUE, что както уже загадочно...


Барра Кабамма   (2008-11-10 17:21:00) [11]

ты сам поменьше сказок рассказывай.
приведен код как есть и приведен лог как есть.

Parameters.Count нулевой


sniknik   (2008-11-10 17:18:00) [12]

> Относится к верхнему with
ну так нет там такой, у верхнего with, берется системная.

> В логе:
> 10.11.2008 17:10:28 Parameters.Count =  0
сказок не рассказывай... так я тебе и поверил после [20] (хотя и до этого не очень то...).


Барра Кабамма   (2008-11-10 17:12:00) [13]

это что за переменная? к чему относится?

Относится к верхнему with

Log('Parameters.Count = ',IntToStr(Parameters.Count));
Log('ParamCount = ',IntToStr(ParamCount));

В логе:

10.11.2008 17:10:28 Parameters.Count =  0
10.11.2008 17:10:28 ParamCount =  0


sniknik   (2008-11-10 17:12:00) [14]

GRAND ©
ну так как, честь ADO восстановлена? ;)
кто глючит то на самом деле? ;)))


sniknik   (2008-11-10 17:04:00) [15]

> А вот эта не работает из под делфийского адо.
"эта" это собственно какая?

> И ни вы, ни я не знаете почему.
да где нам.

Log('ParamCount = ',IntToStr( ParamCount));
это что за переменная? к чему относится?


Барра Кабамма   (2008-11-10 16:51:00) [16]

Вот последний копипаст из редактора кода

with TADOCommand.Create(Self) do
 try
  Connection  := ADOConnection;
  if not ADOConnection.Connected then ADOConnection.Connected := True;  CommandType := cmdStoredProc;
  CommandText := Format('%s.dbo.GET_ACCOUNT_SALDO;1',[fDB]);
  //CommandText := Format('%s.dbo.GET_ACCOUNT_SALDO',[fDB]);
  Log('CommandText = ',CommandText);
  Parameters.Refresh;
  Log('ParamCount = ',IntToStr(ParamCount));
  for i := 0 to Pred(ParamCount) do Log(Parameters.Items[i].Name);

и в логе круглый ноль.


Барра Кабамма   (2008-11-10 16:46:00) [17]

В общем резюмирую, мужики.
Вся ваша уверенность в безгрешности делфийского адо и собственного  умения с ним работать зиждется на ограниченном жизненном опыте. Написали сотню однотипных хранимок, которые работают из под адо и все.
У меня тоже сотня хранимок работает. Одни возвращают наборы данных, другие строковые параметры.
А вот эта не работает из под делфийского адо.

И ни вы, ни я не знаете почему.


Барра Кабамма   (2008-11-10 16:38:00) [18]

sniknik ©   (10.11.08 16:15) [9]
> коннект к серверу в момент рефреша есть?


До возни с этой процедурой приложение уже успело выполнить с десяток запросов с mssql. Авторизовать пользователя, прочитать его профиль, вставить кучу записей в лог таблицу и т.д.


Барра Кабамма   (2008-11-10 16:36:00) [19]

;1

и так тоже делал.
и два раза приседал и крек-пекс-фекс тоже говорил.


sniknik   (2008-11-10 16:36:00) [20]

> Ну ё-мае, мужики. Сколько можно?
действительно...

> Ноль параметров у меня после рефреша. Ноль!
значит варианты
MsGuns ©   (10.11.08 15:38) [5]
> Очевидно, не так пробовал.

sniknik ©   (10.11.08 16:15) [9]
> коннект к серверу в момент рефреша есть?


Страницы:   1 2

Наверх

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