高人指点:关于cardinal数据类型的数值存储到mysql数据库中问题

qingshan2018 2018-12-30 02:46:07
delphi7、mysql数据环境下,通过adoconnect进行mysql数据库读写操作
数据库中字段ip是 INT(10) unsigned 型
程序中变量ip1 是cardinal型变量,
通过adotable进行数据库操作时adotable.FieldByName('ip').Asinteger:=ip1; 如果ip1数值<2147483647数值时,程序正常可以存储,如果ip1数值大于2147483647时(比如:ip1:=3232235620),程序报错。我知道是数值溢出的问题,mysql数据库手工输入字段ip='3232235620'可以存储,我分析是adotable.FieldByName('ip').Asinteger是有符号整形数据类型问题,怎么能够解决?请高手指点,多谢!
ip1:=3232235620;
//FieldByName('ip').AsString:=inttostr(ip1));
FieldValues['ip']:=ip1
...全文
800 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
不建议使用ADO连mysql 曾经D7用ADO连mysql(ODBC) 会遇到各种莫名其妙的问题(有些是ODBC本身的限制原因), 最后改用了SQLConnection连libmysql.dll 关于上面报错的, 看了下ADO源码, 猜测应该是TIntegerField.SetAsInteger中CheckRange部分, 关于FMinValue, FMaxValue获取错误造成的(手边没mysql没法验证) 所以, 我觉得不使用具体数据类型的写入(避免边界检查), 直接写数据值(FieldByName('ip').SetData)就可以了 具体用法可以参考SetAsInteger中的代码
qingshan2018 2019-01-01
  • 打赏
  • 举报
回复
谢谢各位热心解答。
persuit666 2019-01-01
  • 打赏
  • 举报
回复
不推荐适用ADO连接Mysql,出现很多莫名其妙的问题 ,同意16楼观点!
weixin_41953311 2019-01-01
  • 打赏
  • 举报
回复
我之前做一个项目的时候也用的这个方法,还可以吧
BlueStorm 2018-12-31
  • 打赏
  • 举报
回复
adotable.FieldByName('ip').Asinteger:=ip; 改为 adotable.FieldByName('ip').AsLongWord:=ip1; 或者 adotable.FieldByName('ip').Value:=ip1;
秋天之落叶 2018-12-31
  • 打赏
  • 举报
回复
Picture1创建的对象Picture1 := TPicture.Create
你改成二进制类型试一试
秋天之落叶 2018-12-31
  • 打赏
  • 举报
回复
引用 12 楼 qingshan2018 的回复:
AsLargeInt也不行,我看看还有没有其他方法。insert 插入二进制字段方面用过吗?我用insert可以解决问题,但是又有一个二进制字段insert怎么插入不会。

dm1.ADOQuery1.Parameters.ParamByName('照片').Assign(Picture1);
好像是这样的
lyhoo163 2018-12-31
  • 打赏
  • 举报
回复
最好的办法是更换字段类型。你说不能变更字段类型,那是致命的问题!
qingshan2018 2018-12-31
  • 打赏
  • 举报
回复
AsLargeInt也不行,我看看还有没有其他方法。insert 插入二进制字段方面用过吗?我用insert可以解决问题,但是又有一个二进制字段insert怎么插入不会。
BlueStorm 2018-12-31
  • 打赏
  • 举报
回复
或者用UniDac,放弃ado
BlueStorm 2018-12-31
  • 打赏
  • 举报
回复
那就试试adotable.FieldByName('ip').AsLargeInt:=ip1;如果还不行的话那你只能升级Delphi了。
qingshan2018 2018-12-31
  • 打赏
  • 举报
回复
adotable.FieldByName('ip').AsLongWord:=ip1;没有aslongword属性 adotable.FieldByName('ip').Value:=ip1; 也不行。
qingshan2018 2018-12-30
  • 打赏
  • 举报
回复
没人帮忙吗?
qingshan2018 2018-12-30
  • 打赏
  • 举报
回复
补充一下,数据库中的ip字段存储数值大于2147483647,可以正常读取出来并显示。 StringGrid1.Cells[2,i]:= InttoHex(FieldValues['ip'],8); FieldValues['ip']是iINT(10) unsigned integer,而往数据库里写就不可以。
qingshan2018 2018-12-30
  • 打赏
  • 举报
回复
mysql 数据库中ip是INT(10) unsigned integer的,可以存储最大值为4294 967 295,现在的问题好像是ado控件只支持有符号的integer2147483647最大值,不支持cardinal整形,高手能解决这个问题吗?数据库结构是统一的,不能够更改字段类型。
morninggood 2018-12-30
  • 打赏
  • 举报
回复
看起来应该用longint或者varchar类型吧
qingshan2018 2018-12-30
  • 打赏
  • 举报
回复

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧