INSERT=APPPEND?????(100分)

  • 主题发起人 主题发起人 500/2
  • 开始时间 开始时间
5

500/2

Unregistered / Unconfirmed
GUEST, unregistred user!
我发现是不是大型数据库逻辑顺序和物理顺序是分开的?
请看下面的例子:(SQL=SELECT * FROM 数据库)
在DBGRID中显示一库内容:
序号 人员编号 姓名
1 001 张三
2 002 王五
3 003 赵六
其中序号字段是一计算字段,参照以前大虾们的讨论结果设置:
dataset1['no']:=recno; 表面看效果还是不错的。但是.....

当我将光标移到第二行,按[INS]键,插入新行“李四”的时候,
出现奇怪现象:

问题一:
序号 人员编号 姓名
1 001 张三
3 (空白)(空白)//怎么序号是3,理想情况1,2,3,4
2 002 王五
3 003 赵六

问题二:
序号混乱尚无关大碍,大不了不要了,但当光标移倒其它行时,
出现更为奇怪的结果:
序号 人员编号 姓名
1 001 张三
2 002 王五
3 003 赵六
4 ??? 李四//序号倒是顺了,只是没插入,而是APPEND
故此,我认为:大型数据库逻辑顺序与物理顺序是分开的,
当你插入的时候,实际上追加(APPEND),只是用SQL排序才能出现
想要的结果。
我想只能如下解决:
①改SQL为 Select * from 数据库 order by 人员编号
②每插入、删除、追加新记录时就先CLOSE、再OPEN数据集
或刷新数据集
太苯了,有无好办法?
 
Insert是在当前记录位置插入空记录;而Append则是在数据库最后
插入空记录。
 
逻辑位子不一样。
 
大型数据库逻辑顺序与物理顺序是分开的
// 是啊
 
为什么叫 TTable 、TQuery 等叫数据集对象? 就是因为它是记录的集合,集合元素肯定是
无序的。
大型数据库对待记录确实是无序的,但是数据一旦被 Select 出来,它就成了一个“光标”,
记录在 Cursor 中就是有序的了,否则没办法访问。
TTable 控件(可以看成一个光标)中记录的顺序是按照默认的索引字段排列的,数据添加
完之后,只要一 Refresh ,记录就会呈现有序的状态。
你插入的记录被移动到了最后,仅仅是它在 Cursor 中的表现形式,一般新加入的记录都
被放在最后,TTable 控件提供的 Append 和 Insert 方法,其实归根结底都被数据库引擎
转化成了 SQL 语句 Insert Into ...,所以不管你使用什么方法添加记录,数据库引擎是
一视同仁的。
 
BAKUBAKU的回答和书上的一样。sql数据库都是这样的,物理位置的
区分在文件数据库里可以看到。
 
我自然知道大型数据库逻辑顺序与物理顺序是无关的,
SECLECT出来的数据似乎只能通过ORDER来排序,
但如无ORDER,默认顺序就是物理顺序吧?

无论怎样,如确实必要实现插入位置就是实际位置,
显示在DBGRID中,光标一走还留在那里不动,
有无实际可行的办法?否则编程者知道其中奥妙,而用户还以为是BUG呢!

是不是可以这样做,设置一个动态字段,开始时记住在DBGRID中的行号,
插入时比该行大的顺序加一,
删除时比该行小的顺序减一,
然后重新REFRESH,但又会造成DBGRID闪烁,记录先跑到最后,
刷新后又回到中间,有其它更好的办法呢?
 
>> 但如无ORDER,默认顺序就是物理顺序吧?
如果没有 Order By ,默认顺序应该是 Primary Index 序。
如果确实想插入之后保留在原地,那么你可以在插入时在程序中自动为 Primary Index 字段
赋值为一个中间大小的值。
 
500/2:如果你还要继续讨论请定期提前你的帖子,如果不想继续讨论请结束帖子。
 
虽然从SYBASE到DB2到ORACLE,虽然我也知道物理和逻辑的不同.
不过有谁能告诉我记录的物理顺序是如何的.
还是那句话数据是数据, 表示是表示, 这本来就是两个层面的东西.

一旦你看到了它, 它已经成了表示.

为什么老是把界面和数据搅和到一起.

怎么来处理界面如何操纵数据这本来就是数据库相关开发的要处理的两个基本问题.

另外,大型数据软件开发中一般最好不要用数据感知控件去做数据的INSET/UPDATE操作.

SELECT倒也罢了.
 
不夜城说的对,就是要解决界面的问题。这在我们中国非常注重的形式的国度很重要。
比如说一个人事库,部门经理要放在第一位,小兵在后,后来调来一个副经理,要
插在经理与兵之间,放在尾部他会生气的。
要确实想有序,只能用加编号字段,但编号是手动的?还是自动的?
手动号输起来太麻烦,而且增删人之后编号又断断续续。
自动号每次增删人都要重新刷新整个库,而且利用编号来代表某人也失去意义,
因为编号每人都不固定了。
对于类似问题,真不知别人是如何解决的???????????????????
 
多人接受答案了。
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
850
SUNSTONE的Delphi笔记
S
S
回复
0
查看
782
SUNSTONE的Delphi笔记
S
后退
顶部