Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C/C+中传递什么作为ODBC SQLBindParameter的ColumnSize参数+;节目?_C++_C_Odbc - Fatal编程技术网

C++ 在C/C+中传递什么作为ODBC SQLBindParameter的ColumnSize参数+;节目?

C++ 在C/C+中传递什么作为ODBC SQLBindParameter的ColumnSize参数+;节目?,c++,c,odbc,C++,C,Odbc,我正在学习如何使用SQLBindParameter函数。我在互联网上浏览了几个例子,不清楚应该将什么作为第6个参数传递给sqlbindparmeter函数 当C类型为SQL\u C\u CHAR时,示例at传递字符数组的大小;当C类型为SQL\u C\u SSHORT时,示例at传递0 SQLSMALLINT sCustID; SQLCHAR szEmployeeID[EMPLOYEE_ID_LEN]; SQL_DATE_STRUCT dsOrderDate; SQLINTEGER cb

我正在学习如何使用
SQLBindParameter
函数。我在互联网上浏览了几个例子,不清楚应该将什么作为第6个参数传递给
sqlbindparmeter
函数

当C类型为
SQL\u C\u CHAR
时,示例at传递字符数组的大小;当C类型为
SQL\u C\u SSHORT
时,示例at传递0

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

但是,一个示例在0处传递了SQL_C_TCHAR,在0处传递了SQL_C_LONG的一些正整数

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


有人能澄清一下我们是如何决定要传递到
sqlbindparmeter
中的参数的吗?

这有助于确定某些类型的参数的字节大小,而其他类型的参数则忽略

假设您有一个
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,尽管它包含的字符串小得多,但仍有分配的所有空间。

这有助于确定某些类型参数的字节大小,该类型参数被忽略其他的

假设您有一个
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,即使它包含的字符串小得多,它仍然分配了所有空间。

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

所有字符类型

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

对于固定长度(
SQL\u INTEGER
等)数据类型,SQLBindParameter的
ColumnSize
参数被忽略。()

SQL\u PARAM\u INPUT
时,某些驱动程序可能会忽略它,但其他驱动程序可能会将缓冲区截断为
ColumnSize
对于可变长度数据类型,大小描述传输到服务器的最大数据量。例如,对于Unicode字符串值,可以使用Size将发送到服务器的数据量限制为前100个字符。()

当未指定
ColumnSize
时,某些驱动程序无法找到列(尤其是
[Microsoft][ODBC SQL Server Driver]计数字段不正确或语法错误),即使发送NULL也是如此。

对于双向和输出参数以及返回值,必须设置大小的值。()

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

所有字符类型

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

对于固定长度(
SQL\u INTEGER
等)数据类型,SQLBindParameter的
ColumnSize
参数被忽略。()

SQL\u PARAM\u INPUT
时,某些驱动程序可能会忽略它,但其他驱动程序可能会将缓冲区截断为
ColumnSize
对于可变长度数据类型,大小描述传输到服务器的最大数据量。例如,对于Unicode字符串值,可以使用Size将发送到服务器的数据量限制为前100个字符。()

当未指定
ColumnSize
时,某些驱动程序无法找到列(尤其是
[Microsoft][ODBC SQL Server Driver]计数字段不正确或语法错误),即使发送NULL也是如此。

对于双向和输出参数以及返回值,必须设置大小的值。()

我还想知道为什么将0作为
BufferLength
(第9个参数)传递。为什么不把它也设为10呢?据我所知,此参数仅在SQL语句执行期间在缓冲区中返回值时使用,以便将返回值截断到此大小以防止缓冲区溢出。我说的对吗?BufferLength参数允许您截断char和binary类型上的ParameterValuePtr大小,对于其他类型AFAIK,它会被忽略。编辑中有一个问题。字符串参数的长度已指定为指向SQL的指针,作为
StrLen\u或\u IndPtr
参数(第10个参数)。这难道不足以精确地知道数据的终点吗?看看
SQL\NTS
的定义,它实际上是-3的值。它指定您使用的是以null结尾的字符串。驱动程序可能会计算长度,但如果不是出于性能原因,最好还是显式传入大小。哦,是的,关于pa的缓冲区溢出预防用法,您是正确的