我正在尝试插入一个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
字符串发送,但会返回相同的错误。
任何人都知道问题可能在哪里?
答案 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
。
SMALLINT
比TINYINT
更多的数据库平台支持unsigned char
。
如果你真的想要一个单字节整数,你必须在C ++中将你的64位整数转换为unsigned char
,然后把它放到net.socket
主变量中。
但是你只会在前端看到“正确”的值,如果它高于127,并且使用任何其他工具从数据库中选择,你会看到垃圾。
祝你好运 - Marco the Sane