2010-05-27 1 views
3

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

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

The documentation говорит следующее:

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

...

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

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

я немного запутался на примере here нашел, в котором они устанавливают размер 3 для параметра adInteger со значением установлено вариантом типа VT_I2

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

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

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

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

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

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

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

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

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

+0

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

ответ

1

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

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

3) Возможно, персонажи.

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