Publish date: 2013-11-14
Cancel of query execution (C#)
using System; using System.Data; using lcpi.data.oledb; using System.Threading; using System.Globalization; namespace Sample_0015{ //////////////////////////////////////////////////////////////////////////////// //class ThreadWorker class ThreadWorker { private readonly OleDbCommand m_cmd; public Exception m_exc=null; //----------------------------------------------------------------------- public ThreadWorker(OleDbCommand cmd) { m_cmd=cmd; }//ThreadWorker //----------------------------------------------------------------------- public void ExecuteNonQuery() { Console.WriteLine("Enter to ThreadWorker.ExecuteNonQuery"); try { m_cmd.ExecuteNonQuery(); } catch(Exception e) { Console.WriteLine("Catch exception in ThreadWorker.ExecuteNonQuery"); m_exc=e; }//catch Console.WriteLine("Exit from ThreadWorker.ExecuteNonQuery"); }//ExecuteNonQuery };//class ThreadWorker ///////////////////////////////////////////////////////////////////////////////// //class Program class Program { private const string c_cn_str ="provider=LCPI.IBProvider.3;" +"location=localhost:d:\\database\\ibp_test_fb25_d3.gdb;" +"user id=gamer;" +"password=vermut;" +"dbclient_library=fbclient.dll"; //----------------------------------------------------------------------- static int Main() { int resultCode=0; try { using(var cn=new OleDbConnection(c_cn_str)) { cn.Open(); using(var tr=cn.BeginTransaction(IsolationLevel.RepeatableRead)) { using(var cmd=new OleDbCommand(null,cn,tr)) { cmd.CommandText="execute procedure SP_EXEC_DUMMY_COUNTER(100000000)"; var threadWorker=new ThreadWorker(cmd); Thread thread=new Thread(threadWorker.ExecuteNonQuery); try { thread.Start(); while(thread.IsAlive) { Thread.Sleep(2000); Console.WriteLine("Cancel"); cmd.Cancel(); }//while Console.WriteLine("threadWorker was stopped"); if(Object.ReferenceEquals(threadWorker.m_exc,null)) { Console.WriteLine("No exception"); } else { Console.WriteLine("Thread exception: {0}", Helper__BuildExcText_InvariantCulture(threadWorker.m_exc)); }//else } finally { thread.Join(); }//finally }//using cmd }//using tr }//using cn } catch(Exception e) { resultCode=1; Console.WriteLine(""); Console.WriteLine("ERROR: {0} - {1}",e.Source,e.Message); }//catch return resultCode; }//Main //----------------------------------------------------------------------- //Get exception message with "invariant" UI-culture private static string Helper__BuildExcText_InvariantCulture(Exception e) { var sb=new System.Text.StringBuilder(); var oldCulture=Thread.CurrentThread.CurrentUICulture; try { Thread.CurrentThread.CurrentUICulture=CultureInfo.InvariantCulture; sb.Append(e.Source).Append(" - ").Append(e.Message); } finally { if(!Object.ReferenceEquals(Thread.CurrentThread.CurrentUICulture,oldCulture)) Thread.CurrentThread.CurrentUICulture=oldCulture; }//finally return sb.ToString(); }//Helper__BuildExcText_InvariantCulture };//class Program //////////////////////////////////////////////////////////////////////////////// }//namespace Sample_0015
Output.