首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C/C++程序中作为ODBC SQLBindParameter的ColumnSize参数传递什么?

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

Stack Overflow用户
提问于 2011-04-08 22:55:00
回答 2查看 3.9K关注 0票数 2

我正在学习如何使用SQLBindParameter函数。我在网上看了几个例子,不清楚我应该把什么作为第六个参数传递给SQLBindParameter函数。

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

代码语言:javascript
复制
SQLSMALLINT sCustID;    
SQLCHAR szEmployeeID[EMPLOYEE_ID_LEN];
SQL_DATE_STRUCT dsOrderDate;
SQLINTEGER cbCustID = 0, cbOrderDate = 0, cbEmployeeID = SQL_NTS;

..。

代码语言:javascript
复制
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传递了一些正整数。

代码语言:javascript
复制
long p1 = 10; 
short p2 = 100; 
TCHAR p3[100];

..。

代码语言:javascript
复制
// 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的参数的

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-04-08 23:12:21

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

假设您有一个SQLCHAR[10]参数,您将把10作为列大小传入:

代码语言:javascript
复制
SQLCHAR empStr[10];
SQLINTEGER len = SQL_NTS;
retcode = SQLBindParameter(hstmt, 1, SQL_PARAM_INPUT, SQL_C_CHAR, SQL_CHAR, 10, 0, empStr, 0, &len);

编辑:

更清楚地说,变量类型需要传入大小,特别是字符串这样的可变大小类型,这样才能知道数据在内存中的结束位置。整数之类的类型具有基于操作系统和环境的静态定义的大小,因此指定大小通常是可选的,或者可能定义了一个常量,您可以使用它来代替计算。

考虑一下:

代码语言:javascript
复制
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 Studio2010的Windows764位机器上,smallInt和bigInt的大小都是4,oneChar的大小是1,charArray的大小是128,即使它包含的字符串要小得多,它仍然分配了所有的空间。

票数 1
EN

Stack Overflow用户

发布于 2020-04-17 16:13:18

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

所有字符类型

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

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

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5596905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档