2

我想锁定一条记录以防止在我使用时没有人可以更新。

但是锁定记录后,即使我自己也无法更新锁定记录:(

在更新记录之前我必须解锁吗?

或者有没有办法更新我锁定自己的记录?

string query = "SELECT * FROM table1";
AdsCommand cmd = conn.CreateCommand();
cmd.CommandText = query;

AdsExtendedReader reader = cmd.ExecuteExtendedReader();
reader.Read();

int recordNo = reader.RecordNumber;
reader.LockRecord(recordNo);

// do something with table1 record
// while doing something, I need to lock the record before I update record

AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED'", conn);
cm.ExecuteNonQuery();
4

2 回答 2

4

不可能在“直接”打开的表(与通过 SQL 操作相反)和 SQL 操作或其他表实例之间共享记录锁。

一种可能性是在获得锁后通过扩展读取器进行更新。您可以使用SetStringSetValue

reader.SetString( colNumber, 'UPDATED' );

另一种可能性可能是更新事务中的记录。然后该记录将由该用户保持锁定,直到提交事务。例如,您可以使用类似以下语句作为“无操作”(假设不涉及触发器)来锁定事务中的记录而不修改数据:

UPDATE table1 set field1 = field1 WHERE pk=1;
于 2012-09-10T15:10:01.117 回答
0

您不能锁定它,然后使用不同的 SQL 语句对其进行更新;这会打开另一个查询实例,这不会发生,因为您将表与第一个实例一起锁定。只是不要担心锁定它,并运行您的UPDATE语句。ADS 将自动为您锁定记录、进行更改和解锁。

// Note I added a WHERE statement with a dummy value for `finvno`, since your 
// select didn't provide one 
AdsCommand cm = new AdsCommand("UPDATE table1 SET field1 = 'UPDATED' WHERE finvno = 'SomeInvNo'", conn);
cm.ExecuteNonQuery();
于 2012-09-10T15:05:31.557 回答