在Delphi中,怎样将记录锁定?(100分)

  • 主题发起人 主题发起人 yifawu1
  • 开始时间 开始时间
Y

yifawu1

Unregistered / Unconfirmed
GUEST, unregistred user!
1. 为访止多个用户对同一个条记录修改,在进入修改之前将当前记录锁定,
当另一个用户欲操作该记录时,先对锁定标志进行检查.在Delphi中, 这些
操作怎样完成? 试举例说明.
2. 在动态SQL 查询语句中,不设参数,而要使用变化的数字型条件,比如说,
要查询 score(成绩) 表中 math>x 的记录,假设 x 的值已在 Edit1.text
中由用户输入, 现如下操作:

query1.close;
query1.sql.clear;
query1.sql.add('select * from score');
query1.sql.add('where math>');
query1.sql.add(edit1.text); ?
......
上面最后一个语句怎样修改(不使用参数,但可用变量).
 
关于第一个问题:
就我所知,好象delphi4.0及以前的版本,没有提供行加锁,实行抢占式,谁先进行访问, 谁就拥有对该记录的修改权,其它人只能通过对提交发生的错误进行分析,才能得知可以对该记录进行修改。听说Delphi5.0提供行加锁, 不妨一试。

第二个问题
应该是变量前加'@ 'or '?', 一时记不起,不妨一试。
 
第二个问题:
Query1.Close;
Query1.SQL.Delete(Query1.SQL.Count - 1);
Query1.SQL.Add(Edit1.text);
...
 
第二个问题中的后三条语句可以合并成:
query.sql.add('select * from score where math > ' + edit1.text);
或者,在query的sql中直接写为:
select * from score where math > :p_value;
然后后四条语句可合并为:
query.parambyname('p_value').asfloat := strtofloat(edit1.text);
query.open;
注:我已在oracle数据库下验证无误.
 
对于第一个问题应该用数据库来直接操作比较好一点,
在d4中我还没见过.
 
第二个问题:
query1.sql.add(str);
query1.parambyname('str').asstring:=edit1.text;
用变量:
query1.sql.add(:str);
str 定义为STRING; 并str:=eidt1.text;

 
对于第一个问题应该用数据库来直接操作比较好一点,
若在DELPHI中实现,则要在数据库中添加
一个标志字段。
或者建立一个临时表,作数据字典用。
 
做标记不是一个好办法,如果一个程序设置标记后发生死锁(死循环),别的程序
岂不是再也不能访问该记录了?
 
请问第一个问题用什么解决好? 如果采用抢先式,第一个用户修改了半天,
后来第二个用户一下子先完成了修改,那么第一个用户的工作岂不是白做了
吗?
做标记会出现死锁,当一个用户修改前对记录做了标记,一旦他死机了,
那么这条记录将不是永远无法修改了吗?
最好是一个用户正在修改一条记录时,别的用户能知道这条这条记录正在
修改之中,就自动退出来,就不会干扰第一个用户了.

第二个问题是我在程序中写错了,很抱歉!
 
DELPHI will auto lock the table when it before modify a record.
 
可以使用adonis控件来加强锁功能,它提供有Locktype来处理死锁问题。如下
TADODataSet.LockType:
Specify records locking.
type TLockType = (ltUnspecified, ltReadOnly, ltPessimistic, ltOptimistic, ltBatchOptimistic);
property LockType: TLockType;

Description

ltLockReadOnly - read-only, you cannot alter the data.
tLockPessimistic - pessimistic locking, record by record ?the provider does what is necessary to ensure successful editing of the records, usually by locking records at the data source immediately upon editing.

ltLockOptimistic - optimistic locking, record by record ?the provider uses optimistic locking, locking records only when you call the Update method.

ltLockBatchOptimistic - optimistic batch updates ?required for batch update mode as opposed to immediate update mode.

ltUnspecified - Adonis relies on the underlying datasource to select the locktype.

Example

ADODataSet.LockType := ltPessimistic; // set pessimistic locking
 
多人接受答案了。
 
后退
顶部