Нужен результат команды FoxPro RLOCK() через OLEDbCommand

Я пытаюсь выполнить команду RLOCK() (блокировка записи) в таблице FoxPro через OleDbCommand, но мне нужно знать, удалось ли выполнить блокировку. В FoxPro функция RLOCK() возвращает .T. или .Ф. чтобы указать, удалось ли это.

Как мне получить этот результат через 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 (правда), даже когда блокировка не должна была происходить из-за того, что запись уже заблокирована кем-то другим.

Спасибо за вашу помощь.


person RHarris    schedule 25.02.2016    source источник


Ответы (1)


Потому что вы не возвращаете результат rlock() (и что вы используете ExecuteNonQuery, когда вы должны запрашивать возвращаемое значение и вместо этого использовать ExecuteScalar). Обычно вы возвращаете true с этим кодом, если правильно использовали ExecuteScalar. В 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 не имеет большого значения.

person Cetin Basoz    schedule 26.02.2016
comment
Хорошее разъяснение пользователю о вызове NonQuery и executeScalar(). - person DRapp; 26.02.2016
comment
Огромное спасибо. По какой-то причине у меня сложилось впечатление, что ExecuteScalar() нужно использовать с реальной командой выбора, обновления, вставки или удаления. Это сделало именно то, что мне было нужно - спасибо! - person RHarris; 29.02.2016
comment
Кстати, этот сценарий имеет большое значение в моей среде. У меня есть две системы, в которых запущены автоматизированные процессы, которым необходимо остановить выполнение, если другой процесс запущен. Самый простой способ справиться с этим — заставить каждую систему заблокировать контрольную запись, поместить код в запись и разблокировать запись. Блокировка не позволяет системам одновременно обновлять таблицу. - person RHarris; 29.02.2016
comment
Я понимаю. Я использую аналогичное уведомление через обмен сообщениями с использованием промежуточной таблицы. - person Cetin Basoz; 29.02.2016