Как определить размер параметров команды MSADO - PullRequest
3 голосов
/ 27 мая 2010

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

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

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

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

...

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

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

Я был немного озадачен примером, найденным здесь , в котором для параметра adInteger было установлено значение 3, а для значения было установлено значение типа 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.) Здесь когда-нибудь вступают в игру массивы? (мы не передаем их как параметры, просто любопытно)

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

1 Ответ

2 голосов
/ 04 ноября 2011

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

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

3) Возможно символы.

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

...