需要通过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(真),即使由于记录已经被其他人锁定而不应该发生锁定。
感谢您的帮助。
因为你没有返回 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几乎没有价值。