Что передать в качестве аргумента ColumnSize ODBC SQLBindParameter в программе C / C ++? - PullRequest
1 голос
/ 08 апреля 2011

Я учусь использовать функцию SQLBindParameter.Я просматривал пару примеров в Интернете, и неясно, что я должен передать в качестве шестого аргумента функции SQLBindParameter.

Пример в http://msdn.microsoft.com/en-us/library/ms710963(v=vs.85).aspx передает размермассива символов, когда тип C равен SQL_C_CHAR, и 0, если тип C равен SQL_C_SSHORT.

SQLSMALLINT sCustID;    
SQLCHAR szEmployeeID[EMPLOYEE_ID_LEN];
SQL_DATE_STRUCT dsOrderDate;
SQLINTEGER cbCustID = 0, cbOrderDate = 0, cbEmployeeID = SQL_NTS;

...

retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, EMPLOYEE_ID_LEN, 0, szEmployeeID, 0, &cbEmployeeID);
retcode = SQLBindParameter(hstmt, 2, SQL_PARAM_INPUT, SQL_C_SSHORT, SQL_INTEGER, 0, 0, &sCustID, 0, &cbCustID);

Однако, пример на http://publib.boulder.ibm.com/infocenter/db2e/v8r2/index.jsp?topic=%2Fcom.ibm.db2e.doc%2Fdbeapc1702.html передает 0 для SQL_C_TCHAR и некоторые натуральные числа для SQL_C_LONG.

long p1 = 10; 
short p2 = 100; 
TCHAR p3[100];

...

// bind input parameters 
rc = SQLBindParameter(hstmt, (unsigned short)1, SQL_PARAM_INPUT,
                        SQL_C_LONG, SQL_INTEGER, 4, 0, &p1, sizeof(p1), &len); 
// check return code ... 

rc = SQLBindParameter(hstmt, (unsigned short)2, SQL_PARAM_INPUT, SQL_C_LONG,
                        SQL_SMALLINT, 2, 0, &p2, sizeof(p2), &len); 
// check return code ... 

len = SQL_NTS; 
rc = SQLBindParameter(hstmt, (unsigned short)3, SQL_PARAM_INPUT, SQL_C_TCHAR,
                                SQL_CHAR, 0, 0, &p3[0], 100, &len); 

Может кто-нибудь уточнить, как именно мы решили, что параметры будутперешел в SQLBindParameter?

1 Ответ

2 голосов
/ 08 апреля 2011

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

Скажем, у вас есть параметр SQLCHAR[10], в который вы передадите 10 в качестве размера столбца:

SQLCHAR empStr[10];
SQLINTEGER len = SQL_NTS;
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 10, 0, empStr, 0, &len);

Редактировать:

Чтобы быть более понятными, переменные типы должны иметь размеры, передаваемые в особенно типах переменных размеров, таких как строки, чтобы вы знали, где данные заканчиваются в памяти.Типы, такие как целые числа, имеют статически определенные размеры в зависимости от ОС и среды, поэтому часто необязательно указывать размер, либо может быть определена константа, которую вы можете использовать вместо вычисления.

Учтите:

int smallInt = 5;
int bigInt = 234872634872;
char oneChar = 'A';
char charArray[128] = "CStyle String\0";

int smallIntSize = sizeof(smallInt);
int bigIntSize = sizeof(bigInt);
int oneCharSize = sizeof(oneChar);
int charArraySize = sizeof(charArray);

На моей 64-битной машине с Windows 7, использующей Visual Studio 2010, размер smallInt и bigInt равен 4, размер oneChar равен 1, а размер charArray равен 128.хотя содержащаяся в нем строка намного меньше, ей все равно выделено все пространство.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...