MSSQL ODBC拒绝有效的TINYINT值(数值超出范围)

时间:2017-01-23 16:07:52

标签: c++ sql sql-server odbc

我正在尝试插入一个TINYINT列,根据MSDN docs,该列应该在0到255之间。不幸的是它只需要0-127。如果我尝试插入128或更高,它抱怨:

[22003] (native 0): [Microsoft][ODBC Driver 11 for SQL Server]Numeric value out of range

数据绑定为SQL_C_SBIGINT,因为它是一个通用代码,意味着采用所有整数,但我认为这不应该重要,因为对于数字0-127,它可以正常工作。还有一个选项可以将其作为SQL_C_CHAR字符串发送,但会返回相同的错误。

任何人都知道问题可能在哪里?

2 个答案:

答案 0 :(得分:1)

所以,问题实际上正在发生,因为作为测试的一部分,我使用SQLFetch()SQLGetData()“选择”插入的数据,并作为{{1}使用的目标数据类型我使用了SQLGetData()又名签名版本。因此,在插入数据时,但是当我试图“选择”它们时,问题没有发生。

答案 1 :(得分:0)

答案实际上已经给出,但没有突出显示。

TINYINT是一个单字节签名的整数。从Hex 00到Hex 7F(或Bin 0000 0000到0111 1111,或Dec 0到127)的所有值都是正数;从Hex 80到Hex FF(或Bin 1000 0000到1111 1111或Dec 128到255)的所有值都是负数。

我担心对于任何大于127的有符号整数,你必须使用两个字节的整数SMALLINT

SMALLINTTINYINT更多的数据库平台支持unsigned char

如果你真的想要一个单字节整数,你必须在C ++中将你的64位整数转换为unsigned char,然后把它放到net.socket主变量中。

但是你只会在前端看到“正确”的值,如果它高于127,并且使用任何其他工具从数据库中选择,你会看到垃圾。

祝你好运 - Marco the Sane

相关问题