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

Need the result of a FoxPro RLOCK() command via OLEDbCommand

我正在尝试通过 OleDbCommand 在 FoxPro table 上执行 RLOCK() 命令(记录锁定),但我需要知道锁定是否成功。在 FoxPro 中,RLOCK() returns .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(真),即使由于记录已被其他人锁定而不应发生锁定。

感谢您的帮助。

因为您没有 returning rlock() 的结果(并且您正在使用 ExecuteNonQuery,当您应该询问 return 值并改用 ExecuteScalar 时)。如果您正确使用了 ExecuteScalar,您通常会使用该代码返回 true。在 VFP 中,每个过程 returns .T.如果未指定 return 值(或者如果您愿意,可以将其称为函数 - 在 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 没有什么价值。