【问题标题】:OLEDB FOXPRO LOCK RECORDOLEDB FOXPRO 锁定记录
【发布时间】:2013-05-02 16:39:46
【问题描述】:

如何通过 OLEDB 锁定具有 sono='12345' 的 foxpro 表,而不是锁定整个表?使用 rlock(),我可以按数字锁定记录,但不知道如何使用过滤器锁定记录。

这是我如何通过记录号锁定表

string vfp = "[ SET EXCLUSIVE OFF ] + chr(13) + "; vfp += " [ USE table IN 0 ALIAS a_table ] + chr(13) +"; vfp += " [ LOCK('1,2,3,4', 'a_table ') ]";

        dbConn.Open();
        using (OleDbCommand cmd = dbConn.CreateCommand())
        {

            cmd.CommandText = "Exec( " + vfp + " ) ";
            cmd.ExecuteNonQuery();
        }

【问题讨论】:

  • 您通过 OleDB 锁定记录的目的是什么。该锁仅在连接期间可用,如果您在完成您尝试做的任何事情之前断开连接,无论如何您都将失去锁。 Jerry 的选项似乎最接近多记录锁定的解决方案。然而,看起来你会做更多的事情,并最终尝试构建一个通过 ExecScript() 调用运行的整个过程。我不一定认为这是可行的。

标签: c# asp.net oledb foxpro


【解决方案1】:

如果将“记录指针”定位在要锁定的记录上,然后不带参数调用 RLOCK(),则记录将被锁定。

这个命令序列可以做到:

  SET EXCLUSIVE OFF
  USE table IN 0 ALIAS a_table
  SELECT a_table
  LOCATE FOR sono='12345'
  RLOCK()

这假设 LOCATE 命令实际上找到了 sono='12345' 的记录。

或者,如果您有可以使用的索引,您可以使用 SEEK 命令或 SEEK() 函数。

【讨论】:

  • 如何找到所有有 sono='12345' 的记录?
  • 正如 Jerry 所说,您需要建立一个包含 sono='12345' 的记录的记录数列表,然后锁定记录。
【解决方案2】:

您必须 SET FILTER TO ,然后遍历过滤器并将记录号存储到 var,然后根据 var 中的记录号 RLOCK。

 //Perhaps use a SQL Command to filter
 USE mytable in o ALIAS a_table
 SELECT RECNO() AS ID FROM mytable INTO CURSOR myCursor NOFILTER
 SELECT myCursor
 idList = ""
 LOCATE   &&Same as GO TOP
 SCAN
    idList = idList + ALLTRIM(STR(ID)) + ", "
 ENDSCAN
 SET MULTILOCKS ON   &&Remember to turn this ON
 isAllRecordsLocked = RLOCK(idList, 'a_table')  &&Perform RLOCK()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2022-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多