2016-02-25 53 views
0

我試圖通過OleDbCommand在FoxPro表上執行RLOCK()命令(記錄鎖),但我需要知道鎖是否成功。在FoxPro中,RLOCK()返回.T。或.F。以表明它是否成功。需要通過OLEDBCommand的FoxPro RLOCK()命令的結果

如何通過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(真),即使鎖應該不會發生由於該記錄已被鎖定由別人。

感謝您的幫助。

回答

2

因爲你沒有返回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沒有什麼價值。

+0

很好的澄清NonQuery與executeScalar調用()的用戶。 – DRapp

+0

非常感謝。出於某種原因,我的印象是ExecuteScalar()必須與實際的選擇,更新,插入或刪除命令一起使用。這正是我所需要的 - 謝謝! – RHarris

+0

順便說一下,這個腳本在我的環境中有很大的價值。我有兩個系統運行自動化進程,如果其他進程正在運行,則需要停止執行。處理這個問題的最簡單方法是讓每個系統鎖定一個控制記錄,在記錄中放置一個代碼並解鎖記錄。鎖使系統不會同時更新表。 – RHarris