繁体   English   中英

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

[英]What to pass as the ColumnSize argument of ODBC SQLBindParameter in a C/C++ program?

我正在学习如何使用SQLBindParameter函数。 我正在浏览 Internet 上的几个示例,但不清楚我应该将什么作为第 6 个参数传递给SQLBindParameter函数。

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_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的参数吗?

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

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

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

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

所有字符类型

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

对于固定长度( SQL_INTEGER等)数据类型,将忽略 SQLBindParameter 的ColumnSize参数。 ( ODBC 参考)

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM