powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO Command output параметры
9 сообщений из 9, страница 1 из 1
ADO Command output параметры
    #39555289
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть простенькая процедура на Oracle
Код: plsql
1.
2.
3.
4.
5.
6.
7.
CREATE PROCEDURE SP_E_TEST(
   in_param IN NUMBER,
   out_param OUT NUMBER)
AS
BEGIN
  out_param := in_param + 10;
END;

Вызываю через ADOCommand
Код: pascal
1.
2.
3.
4.
5.
6.
  ADOCommand1.CommandText := 'call sp_e_test(:in, :out)';
  ADOCommand1.Parameters.ParamByName('in').Value := 5;
  ADOCommand1.Parameters.ParamByName('out').Direction := pdOutput;
  ADOCommand1.Parameters.ParamByName('out').DataType := ftInteger;
  ADOCommand1.Execute;
  Msg(ADOCommand1.Parameters.ParamByName('out').Value);

все работает. Но не нравятся мне выделенные строки. Можно ли как-то их убрать и заставить клиента самому подтянуть метаданные по параметрам?

Вызов
Код: pascal
1.
ADOCommand1.Parameters.Refresh

приводит к полной очистке параметров, т.к. вызов
Код: pascal
1.
if OLEDBParameters.GetParameterInfo(ParamCount, PDBPARAMINFO(ParamInfo), @NamesBuffer) = S_OK then

в TParameters.InternalRefreshюRefreshFromOleDB возвращает 0x80040E51

Провайдер OraOLEDB.Oracle.1

С уважением, Vasilisk
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39555312
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ADOStoredProc не пробовал?

P.S. Не надо АДО для Оракла использовать.
Лучше старый DOA или AnyDAC возьми.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39555316
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамADOStoredProc не пробовал?Нет. Интересует именно ADOCommand.

В принципе можно достать все таким запросом
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
SELECT
  arg."ARGUMENT_NAME",
  arg."IN_OUT",
  arg."DATA_TYPE"
FROM
  sys.all_arguments arg
WHERE
  arg."OWNER" = :schema AND
  arg."OBJECT_NAME" LIKE UPPER(:name) AND
  arg."POSITION" > 0 
ORDER BY
  arg."POSITION"

но не вдохновляет
Гаджимурадов РустамP.S. Не надо АДО для Оракла использовать.Так все плохо?
Гаджимурадов РустамЛучше старый DOA или AnyDAC возьми.Сейчас интересует нечто бесплатное с поддержкой 12 оракла. Вполне вероятно, что впоследствии купим FireDAC.

Я понимаю, что с AnyDAC на FireDAC переползти легко. Но бесплатные версии жутко древние
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39555341
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_> В принципе можно достать все таким запросом

Так первый вариант много лучше. Или ты хочешь свой патч делать?

> Так все плохо?

Я не слежу за их потугами, но AFAIU, ADO почти deprecated, нет
смысла связываться для новых проектов, тем более для 12 оракла.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39555346
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Гаджимурадов РустамADO почти deprecated, нетА на сайте оракла OraOLEDB свежий лежит.

Впрочем, я тебя услышал. Спасибо за инфу
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39555352
Гаджимурадов Рустам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
> А на сайте оракла OraOLEDB свежий лежит.

Так ты OLEDB и Delphi-шные ADO не путай...
Впрочем, не настаиваю, работать с ней можно.
Но заполнение out-параметров - стандартный
подход, даже в .Net так делается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39564713
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему. Для будущих поколений.

_Vasilisk_Вызов
Код: pascal
1.
ADOCommand1.Parameters.Refresh


приводит к полной очистке параметров, т.к. вызов
Код: pascal
1.
if OLEDBParameters.GetParameterInfo(ParamCount, PDBPARAMINFO(ParamInfo), @NamesBuffer) = S_OK then


в TParameters.InternalRefreshюRefreshFromOleDB возвращает 0x80040E51
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
function TParameters.InternalRefresh: Boolean;
  ...........
begin
  BeginUpdate;
  try
    Clear;
    if Command.CommandType = cmdText then
      RefreshFromOLEDB else
      RefreshFromADO;
    Result := Count > 0;
  finally
    EndUpdate;
  end;
end;

RefreshFromOLEDB, действительно не достает параметров. Но параметры достает RefreshFromADO. Чтобы она вызвалась нужно изменить CommandType с cmdText. Т.к. у нас процедура, то устанавливаем cmdStoredProc. Но тогда должен быть другой формат CommandText.

Итого для процедуры
_Vasilisk_
Код: plsql
1.
2.
3.
CREATE PROCEDURE SP_E_TEST(
   in_param IN NUMBER,
   out_param OUT NUMBER)


делаем так
Код: pascal
1.
2.
3.
4.
5.
6.
ADOCommand1.CommandType = cmdStoredProc;
ADOCommand1.CommandText := 'SP_E_TEST';  // Вместо call sp_e_test(:in, :out) для CommandType = cmdText
ADOCommand1.Parameters.Refresh;  // Подгружаем типы и направления параметров
ADOCommand1.Parameters.ParamByName('in_param').Value := 5;  // Имена параметров поднимаются из базы
ADOCommand1.Execute;
Msg(ADOCommand1.Parameters.ParamByName('out_param').Value);


Все работает. Только нужно помнить, что имя процедуры должно быть записано в том же регистре, что и в базе, иначе ADOCommand1.Parameters.Refresh вываливается с сообщением
Project Project1.exe raised exception class EOleException with message 'Не удается найти текст сообщения с номером 0x80040e51 в файле сообщений OraOLEDB'.для CommandType = cmdText регистр значения не имеет

А теперь отдельные грабли по возвращаемым строковым параметрам. У параметра есть свойство Size. Для CommandType = cmdText для всех параметров оно выставляется в -1. Для CommandType = cmdStoredProc после Parameters.Refresh оно выставляется в 0. Выполнение запроса (для любого CommandType) с выходными строковыми параметрами и установленных для них Size <= 0, получаем исключение
Project Project1.exe raised exception class EOleException with message 'Неправильно определен объект Parameter. Предоставлены несогласованные или неполные сведения'.Если указать значение > 0, но меньше, чем длина возвращаемого значения, то для SQL типа CHAR возвращается NULL, а для VARCHAR значение обрезается до указанного числа символов. Если указать значение больше, чем длина возвращаемого значения, то для SQL типа CHAR значение добивается пробелами, а для VARCHAR возвращается как есть.
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39564716
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_Если указать значение > 0, но меньше, чем длина возвращаемого значения, то для SQL типа CHAR возвращается NULL,Проверил. Оказалось не так. У меня в CHAR возвращается строковый GUID (38 символов). При Size < 300 возвращается NULL. При Size = 300 возвращается строка длиной 300 символов. 38 символов GUID и 300-38=262 пробелов
...
Рейтинг: 0 / 0
ADO Command output параметры
    #39564720
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К слову
Гаджимурадов РустамADOStoredProc не пробовал?ADOStoredProc - это ADOCommand c CommandType = cmdStoredProc
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ADO Command output параметры
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]