Delphi7数据库应用开发ADO数据类型为bigint大整数的一个问题
用Delphi来开发windows pc桌面数据库应用程序是非常方便,使用自带的VCL控件ADO组件是能非常方便的开发出Windows下数据库应用的。
如果在低版本如Delphi7中使用ADO连接SQLServer,主键ID使用bigint,如果使用雪花算法生成ID,数据位数为18位左右就需要注意:在特定情况会出现一个bug,ADOQuery获取得数据库出来的数据是错的
问题现象
实际数据库里的内容
这个问题在高版本Delphi已修复,通过第三方UniDac组件测试是能正确显示的,这应该是Delphi7自带的ADO组件有Bug造成的
ADO与UniDAC比较验证结果
所以在使用ADOQuery及雪花算法生成ID就需要特别注意了
附上测试表:SQL
CREATE TABLE [dbo].[tb1] (
[ID] bigint NOT NULL primary key ,
[ID1] varchar(30) NULL,
[NAME] varchar(30) NULL
)
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926010', N'9261788060926010', N'A1')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926011', N'9261788060926011', N'A2')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926012', N'9261788060926012', N'A3')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926013', N'9261788060926013', N'A4')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926014', N'9261788060926014', N'A5')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926015', N'9261788060926015', N'A6')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926016', N'9261788060926016', N'A7')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926017', N'9261788060926017', N'A8')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926018', N'9261788060926018', N'A9')
GO
INSERT INTO [dbo].[tb1] ([ID], [ID1], [NAME]) VALUES (N'9261788060926019', N'9261788060926019', N'A10')
GO