解决此问题,给100分,马上结贴~

Daniel22_cn 2005-09-19 11:12:36
PB 7.0 + MS SQL2000

数据库中有一个表,表中一个字段为自增字段,设置为了主键,用Datawindow去Update.

更新成功后,我如何知道这个字增变量是多少?
...全文
419 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
Daniel22_cn 2005-11-29
  • 打赏
  • 举报
回复
我确实遇到了这个问题。

我们把表自增变量作为了主键,并且需要更新之后的此值关联另外一张表。
你可以说这是设计上的问题,但是事实就是这样。

再楼上的一位,你说的有点道理,就是使用GetItem就会得到,我们现在的现实情况是,大部分机器上能够得到这个值,但是有些却不能。这个时候,你甚至会怀疑是否是PB坏了。因为重新安装PB就能取到。

所以,我想换种方法,比较稳定的,能够让人放心的方法。

这段时间出差了,没来看。但我一直关注着这个帖子的发展情况。
  • 打赏
  • 举报
回复
这是没有意义的问题.通常如果用自动增值的列作为主键,那么是不会关心它update后得到的值是什么的. 通常用的是另外的关键词去检索. 比如我做一个修改LOG,用的是自动增量的列名,但我不会管它是什么,我用的检索参数是文档编号.当然一个文档编号可能有N多个记录,那么谁会去关心那个serialno是什么呢?
njz168 2005-11-23
  • 打赏
  • 举报
回复
如果是用数据窗口来update那实在是很简单,你update成功之后,自增字段,自然会显示在数据窗口中。你用getitem就能得到。
所以,建议用数据窗口的update来insert,不但减少了代码量,而且,一切都方便多了,不是么?
老奀 2005-11-20
  • 打赏
  • 举报
回复
同意 任由风吹的方法
cbz0660 2005-11-02
  • 打赏
  • 举报
回复
哈哈﹐學習ing﹐頂一下﹐要是你的數據太多了的話就用retrieve()吧﹐或是count(*)一下表的記錄﹐不過這樣也不准確﹐要是你在程序中執行了delete的話你的這個記錄就不准備
a109788522 2005-11-01
  • 打赏
  • 举报
回复
你可以判断这个表当中的最大记录数的个数,那么这个数就是自增量的当前值
robert126 2005-09-29
  • 打赏
  • 举报
回复
同意retrieve 的观点(这是在小的数据库中的做法,要是纪录太长的话,是不现实的),建议使用设置,identity key 的做法
handi 2005-09-29
  • 打赏
  • 举报
回复
Datawindow object里面不是可以设定 identity key 字段的呀。
iwl 2005-09-28
  • 打赏
  • 举报
回复
很简单 ,RETRIEVE一下就可以了
K1933 2005-09-28
  • 打赏
  • 举报
回复
SELECT @@IDENTITY
就可以实现你的问题了。
SELECT TOP 1 @@IDENTITY
INTO :VALUE
FROM xxx
如果你要在PB中调用的话你应该用作成动太SQL语句。
K1933 2005-09-28
  • 打赏
  • 举报
回复
SELECT @@IDENTITY
就可以实现你的问题了。
SELECT TOP 1 @@IDENTITY
INTO :VALUE
FROM xxx
Daniel22_cn 2005-09-28
  • 打赏
  • 举报
回复
继续讨论一下~~
到目前为止,问题没有解决。
章无忌 2005-09-21
  • 打赏
  • 举报
回复
看你的dw的update属性
如果是update-----不变
如果是delete and insert ----等价于先执行delete在执行insert,
那么ID的值应该等于该表该字段的下一个递增值
hillhx 2005-09-21
  • 打赏
  • 举报
回复
如果你是用DW的UPDATE同时新增多条记录,那么你就取不到这个值。

如果你提交的是多条记录,必须用SQL的方法进行新增,才能取到新增加的多个ID

你可以做一个循环,一行一行的新增,写法如下

long ll_newid

insert into table (..)
values(...)
using sqlca;

if sqlca.sqlcode < 0 then
rollback using sqlca;
return
end if

select @@IDENTITY
into :ll_newid
from (select 1)
using sqlca;

commit using sqlca;

用SQL SERVER的 @@IDENTITY全局变量肯定比取MAX对多了
以下是SQL SERVER的帮助
在一条 INSERT、SELECT INTO 或大容量复制语句完成后,@@IDENTITY 中包含此语句产生的最后的标识值。若此语句没有影响任何有标识列的表,则 @@IDENTITY 返回 NULL。若插入了多个行,则会产生多个标识值,@@IDENTITY 返回最后产生的标识值。如果此语句激发一个或多个执行产生标识值的插入操作的触发器,则语句执行后立即调用 @@IDENTITY 将返回由触发器产生的最后的标识值。若 INSERT 或 SELECT INTO 语句失败或大容量复制失败,或事务被回滚,则 @@IDENTITY 值不会还原为以前的设置。
mtu207 2005-09-20
  • 打赏
  • 举报
回复
同意1+1的用法

不过,知道这个干吗呢?如果你能update了,这个字段的置就已经知道啦,select一下不就知道?

也许楼主的意思俺莫明白。
wscft 2005-09-20
  • 打赏
  • 举报
回复
同意一楼的思路!
zwfhome1 2005-09-19
  • 打赏
  • 举报
回复
多用户时可以变通一下,加一个机器编号字段,update 之后 SELECT max where id="机器号"
workhand 2005-09-19
  • 打赏
  • 举报
回复
自动增长列不要设为主键。应该只是其他表做关联是得外键
li_d_s 2005-09-19
  • 打赏
  • 举报
回复
这个不好办。如果只是单机程序操作,还可以update之后select max,如果是多用户的,最好是自己分配编号
lovelihp 2005-09-19
  • 打赏
  • 举报
回复
ing
加载更多回复(3)

609

社区成员

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

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