需要通过OLEDbCommand获得FoxPro RLOCK()命令的结果

本文关键字:命令 结果 RLOCK FoxPro OLEDbCommand 获得 | 更新日期: 2023-09-27 18:36:24

我正在尝试通过OleDbCommand在FoxPro表上执行RLOCK()命令(记录锁定),但我需要知道锁定是否成功。 在 FoxPro 中,RLOCK() 返回 .T. 或 .F. 以指示它是否成功。

如何通过 OleDbCommand 获得该结果?

这是我当前的代码:

using(var conn = new OleDbConnection(...))  //connection string with VFPOLEDB provider
{
   conn.Open();
   using(var comm = new OleDbCommand())
   {
      string cText = @"[use table in 0] + chr(13) + "
           + @"[RLOCK(table)]";
      comm.Connection = conn;
      comm.CommandText = "Execute(" + cText + ")";
      var result = comm.ExecuteNonQuery();
      Consle.WriteLine(result);
      comm.Dispose();
    }
    conn.Close();
    conn.Dispose();
}

现在,我总是得到一个 1(真),即使由于记录已经被其他人锁定而不应该发生锁定。

感谢您的帮助。

需要通过OLEDbCommand获得FoxPro RLOCK()命令的结果

因为你没有返回 rlock() 的结果(并且你使用的是 ExecuteNonQuery,当你应该询问返回值并使用 ExecuteScalar 时)。如果您正确使用了 ExecuteScalar,您通常会使用该代码返回 true。在 VFP 中,如果未指定返回值,则每个过程都返回 .T.(或者,如果您愿意,请将其称为函数 - 在 VFP 过程中,除了名称外没有区别)。

下面是代码的修订版本:

string myCode =
@"use c:'temp'lockTest
locked = rlock()
return m.locked
";
string strCon = @"Provider=VFPOLEDB;Data Source=c:'temp";
using (OleDbConnection con = new OleDbConnection(strCon))
{
  OleDbCommand cmd = new OleDbCommand("ExecScript", con);
  cmd.CommandType = CommandType.StoredProcedure;
  cmd.Parameters.AddWithValue("@code", myCode);
  con.Open();
  Console.WriteLine(cmd.ExecuteScalar());
  con.Close();
}

虽然这段代码运行良好,但我不知道你会用一个无用的 rlock() 做什么,除了知道由于某种原因你不能锁定它。在现实生活中,Execscript几乎没有价值。