Как определить размер параметров команды MSADO

Я новичок в MS ADO и пытаюсь понять, как установить размер параметров команды, созданный

command.CreateParameter (Name, Type, Direction, Size, Value)

В документации говорится следующее:

Размер
необязательный. Значение Long, указывающее максимальную длину значения параметра в символах или байтах.

...

Если вы укажете тип данных переменной длины в аргументе Type, вы должны либо передать аргумент Size, либо установить свойство Size объекта Parameter, прежде чем добавлять его в коллекцию Parameters; в противном случае возникает ошибка.

1.) Что нужно передать для параметров фиксированного размера? Это "все равно"?

Меня немного смутил пример, найденный здесь , в котором размер параметра adInteger установлен равным 3, а для параметра Value задан вариант типа VT_I2.

pPrmByRoyalty->Type = adInteger;
pPrmByRoyalty->Size = 3;
pPrmByRoyalty->Direction = adParamInput;
pPrmByRoyalty->Value = vtroyal;

VT_I2 подразумевает два байта. Структура tagVARIANT имеет размер 16 байт. Как они попали на тройку? Я вижу, что значение перечисления для adInteger равно трем, но я подозреваю, что это просто совпадение.

Так что это немного сбивает с толку, что передавать для параметров фиксированного размера. Команда, с которой я работаю, всегда использовала sizeof(int) вместо adInteger, и, похоже, это работает. Это правильно?

Теперь о параметрах «переменной длины»: в документации указано, что нужно передавать «максимальную длину… в символах или байтах».

2.) Достаточно ли для adVarChar передать максимальную ширину, определенную в базе данных?

3.) Как насчет типов Wide (например, adVarWChar)? Это символы или байты?

4.) Как насчет adVariant, который может содержать данные фиксированной или переменной длины?

5.) Используются ли здесь массивы? (мы не передаем их как параметры, просто любопытно)

Любые ссылки или личные идеи приветствуются.


person Adam Holmberg    schedule 27.05.2010    source источник
comment
Прошло много времени с тех пор, как я использовал этот интерфейс, но я полагаю, что использовал sizeof(type) для аргументов фиксированного размера. Я подозреваю, что библиотека все равно отбрасывает размер, поэтому вы, вероятно, можете указать любое значение. Я бы передал количество символов для строк, независимо от ширины/узкости. Это безопаснее, и если вы ошиблись, вы обнаружите усечение данных, а не необъяснимые сбои вставки, похороненные под глубоким стеком.   -  person Stabledog    schedule 27.05.2010


Ответы (1)


1) размер необязателен для параметров фиксированной длины, поэтому вы можете передать vtMissing (comutil.h). Кстати, мой размер (подключение к SQL Server) для adInteger равен 4, а тип — VT_I4, VT_I2 — размер 2 и adSmallInt.

2) Это должно сработать, я думаю. Напомните, что максимальная ширина параметра определяется в базе данных, а не столбце таблицы, с которым вы его сравниваете. Размер может использоваться для распределения, поэтому вы должны убедиться, что размер достаточно велик, чтобы любое значение, которое может быть заполнено, поместилось.

3) Вероятно, персонажи.

Что касается 4 и 5, я не знаю, в каком сценарии можно было бы передать adVariant или массив в механизм базы данных.

person Werner Henze    schedule 04.11.2011