数据库的奇怪问题(100分)

  • 主题发起人 主题发起人 fshell
  • 开始时间 开始时间
F

fshell

Unregistered / Unconfirmed
GUEST, unregistred user!
有一数据库,我首先用
Query1.sql.add('Insert into TableName (a,b) values(1,2)');
Query1.ExecSQL();
增加一记录,而这数据库有一自动增加的字段AutoAdd,理论我增加的记录的AutoAdd
字段值应该是最大的,然后我用以下语句想获得我刚刚增加的记录的AutoAdd值
Query2.close();
Query2.sql.add('select max(AutoAdd) as MaxNO from TableName');
Query2.open();
GetAutoAdd := Query2.FieldByName('MaxNO').AsInteger;
可是一查看GetAutoAdd的值,发现却不是我增加的那条记录,而是第二新的记录,可是
查看数据库,我的记录是千真万确的增加了,而且不退出程序,其他地方查找这个数据
库,也能查找得到我增加的记录,那到底为什么呢?
 
(1)Query2.close();
Query2.sql.clear;
Query2.sql.add('select max(AutoAdd) as MaxNO from TableName');
Query2.open();
(2)你用存储过程来实现就可以
 
你增加的是第二新的记录,那么第一新的记录是什么呢?有没有看一下?
 
你用的是insert语句,当然不会是最后的那一笔啦。
 
to antic_ant: 存储过程怎么实现呢? 我不大熟悉数据库类操作, 可否告知? 另外
换成存储过程,这个问题为解决了?
to westboy2000: 我增加的是第一新记录,open出来的确实显示了第二新的,第一新
的记录就是我增加的记录了
to sworld_liu: 在sql的概念里, 应该没有最后的记录吧, 只有以什么前提下最新
的记录吧?
 
我以前写的存储过程参考一下
CREATE PROCEDURE log_login --系统日志记录
(
@user_id varchar(6), --用户名
@mod_id smallint,
@fun_id smallint,
@log_id int output
)
as
begin tran
insert into syslog (user_id,mod_id,fun_id,log_in)values(@user_id,@mod_id,@fun_id,getdate())
commit tran
select @log_id=(select max(Log_id) from syslog)
GO
 
1,请确认你的数据数据库是否需要 commit 一下才能保存据。在发送 insert 后试一下:
Query1.sql.add('Insert into TableName (a,b) values(1,2);');
Query1.sql.add('commit;');
Query1.execsql;
看看这样行不行。

 
数据是真真实实的写进去了,只是写了之后用select查找不到,过一阵子就可以查找得到。

to antic_ant: 我也想这么做, 可是我找不到地方写, 我是用BDE访问PARADOX数据库
 
fshell:请你仔细看看antic_ant第一次給你的回复,也就是第一篇回复文章。
  你之所以没有查到你刚才插入的内容,关键在于你第二次执行select语句的时候
没有sql.clear,那样第二次执行sql的时候又插入了一条。
  该把分給别人了:)
 
昨天有个人问了同样一个类型的问题,你查查
 
自动增加的字段AutoAdd?
是什么样的?
是不是identity?如果是,那你还是别用它
 
to 光子: 请注意看看我的代码, 一个是Query1, 一个是Query2, 所以就算不清也没有
关系吧?

to GoldBaby: 我的自动增加字段是Paradox的Autoincrement类型
 
我觉得应该加query2.sql.clear;
 
我认为你是不是应该刷新一下,就可以了。
 
看来是没有答案了, 平均分配吧
 
后退
顶部