在C / C ++程序中作为ODBC SQLBindParameter的ColumnSize参数传递什么?

时间:2011-04-08 14:55:00

标签: c++ c odbc

我正在学习如何使用SQLBindParameter功能。我在互联网上经历了几个例子,我不清楚我应该把它作为SQLBindParameter函数的第6个参数传递。

http://msdn.microsoft.com/en-us/library/ms710963(v=vs.85).aspx处的示例在C类型为SQL_C_CHAR时传递字符数组的大小,在C类型为SQL_C_SSHORT时传递0。

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的示例为SQL_C_TCHAR传递0,为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的参数?

2 个答案:

答案 0 :(得分:2)

这是为了帮助确定某些类型的参数的字节大小,而其他类型则被忽略。

假设您有一个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);

编辑:

要更清楚,变量类型需要传递大小,特别是可变大小的类型,如字符串,以便您知道数据在内存中的结束位置。诸如整数之类的类型具有基于OS和环境的静态定义的大小,因此通常可选择指定大小,或者可以定义一个可以使用而不是计算的常量。

考虑:

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);

在使用Visual Studio 2010的Windows 7 64位机器上,smallInt和bigInt的大小均为4,oneChar的大小为1,charArray的大小为128,即使它包含的字符串小得多,它仍然具有所有空间分配

答案 1 :(得分:0)

ColumnSize参数对应于数据库方案中的列大小

所有字符类型

已定义或最大的列大小,以列或参数的字符表示(包含在SQL_DESC_LENGTH描述符字段中)。例如,定义为CHAR(10)的单字节字符列的列大小为10。ODBC Reference

对于数字(ColumnSize等)数据类型,将忽略SQLBindParameter的SQL_INTEGER自变量。 (ODBC Reference

SQL_PARAM_INPUT可能会被某些驱动程序忽略,但其他驱动程序可能会将缓冲区截断为ColumnSize 对于可变长度数据类型,“大小”描述了要传输到服务器的最大数据量。例如,对于Unicode字符串值,可以使用Size(大小)将发送到服务器的数据量限制为前一百个字符。.NET ODBC reference

SQL_PARAM_*OUTPUT未指定ColumnSize(尤其是[Microsoft][ODBC SQL Server Driver]COUNT field incorrect or syntax error)时,即使发送NULL,某些驱动程序也无法找到列。 对于双向和输出参数以及返回值,必须设置Size的值。.NET ODBC reference