Finishes asynchronous execution of a SQL statement.
Public Function EndExecuteNonQuery(
ByVal asyncResult As IAsyncResult
) As Integer
public int EndExecuteNonQuery(IAsyncResult asyncResult)
asyncResult The System.IAsyncResult returned by the call to the BeginExecuteNonQuery method.
The number of rows affected, which is the same behavior as the ExecuteNonQuery method.
ArgumentException The asyncResult parameter is null (Nothing in Microsoft Visual Basic).
InvalidOperationException The EndExecuteNonQuery(IAsyncResult) method was called more than once for a single command execution, or the method was mismatched against its execution method.
You must call the EndExecuteNonQuery method once for every BeginExecuteNonQuery call. The call must be made after the BeginExecuteNonQuery call returns. ADO.NET is not thread safe; you must ensure that the BeginExecuteNonQuery call has returned. The System.IAsyncResult passed to the EndExecuteNonQuery method must be the same as the one returned from the BeginExecuteNonQuery call that is being completed. It is an error to call the EndExecuteNonQuery method to end a call to the BeginExecuteReader method, and vice versa.
If an error occurs while executing the command, the exception is thrown when the EndExecuteNonQuery method is called.
There are four ways to wait for execution to complete:
Call EndExecuteNonQuery Calling EndExecuteNonQuery blocks until the command completes. For example:
' Visual Basic Dim cmd As ULCommand = new ULCommand( _ "UPDATE Departments" _ + " SET DepartmentName = 'Engineering'" _ + " WHERE DepartmentID=100", _ conn _ ) Dim res As IAsyncResult res = _ cmd.BeginExecuteNonQuery() ' Perform other work. ' This blocks until the command completes. Dim rowCount As Integer = _ cmd.EndExecuteNonQuery( res ) |
The following code is the C# language equivalent:
// C# ULCommand cmd = new ULCommand( "UPDATE Departments" + " SET DepartmentName = 'Engineering'" + " WHERE DepartmentID=100", conn ); IAsyncResult res = cmd.BeginExecuteNonQuery(); // Perform other work. // This blocks until the command completes. int rowCount = cmd.EndExecuteNonQuery( res ); |
Poll the IsCompleted property of the IAsyncResult You can poll the IsCompleted property of the IAsyncResult. For example:
' Visual Basic Dim cmd As ULCommand = new ULCommand( _ "UPDATE Departments" _ + " SET DepartmentName = 'Engineering'" _ + " WHERE DepartmentID=100", _ conn _ ) Dim res As IAsyncResult res = _ cmd.BeginExecuteNonQuery() While( !res.IsCompleted ) ' Perform other work. End While ' This blocks until the command completes. Dim rowCount As Integer = _ cmd.EndExecuteNonQuery( res ) |
The following code is the C# language equivalent:
// C# ULCommand cmd = new ULCommand( "UPDATE Departments" + " SET DepartmentName = 'Engineering'" + " WHERE DepartmentID=100", conn ); IAsyncResult res = cmd.BeginExecuteNonQuery(); while( !res.IsCompleted ) { // Perform other work. } // This blocks until the command completes. int rowCount = cmd.EndExecuteNonQuery( res ); |
Use the IAsyncResult.AsyncWaitHandle property to get a synchronization object You can use the IAsyncResult.AsyncWaitHandle property to get a synchronization object, and wait on that. For example:
' Visual Basic Dim cmd As ULCommand = new ULCommand( _ "UPDATE Departments" _ + " SET DepartmentName = 'Engineering'" _ + " WHERE DepartmentID=100", _ conn _ ) Dim res As IAsyncResult res = _ cmd.BeginExecuteNonQuery() ' Perform other work. Dim wh As WaitHandle = res.AsyncWaitHandle wh.WaitOne() ' This does not block because the command is finished. Dim rowCount As Integer = _ cmd.EndExecuteNonQuery( res ) |
The following code is the C# language equivalent:
// C# ULCommand cmd = new ULCommand( "UPDATE Departments" + " SET DepartmentName = 'Engineering'" + " WHERE DepartmentID=100", conn ); IAsyncResult res = cmd.BeginExecuteNonQuery(); // perform other work WaitHandle wh = res.AsyncWaitHandle; wh.WaitOne(); // This does not block because the command is finished. int rowCount = cmd.EndExecuteNonQuery( res ); |
Specify a callback function when calling the BeginExecuteNonQuery method You can specify a callback function when calling the BeginExecuteNonQuery method. For example:
' Visual Basic Private Sub callbackFunction(ByVal ar As IAsyncResult) Dim cmd As ULCommand = _ CType(ar.AsyncState, ULCommand) ' This won't block since the command has completed. Dim rowCount As Integer = _ cmd.EndExecuteNonQuery( res ) End Sub ' Elsewhere in the code Private Sub DoStuff() Dim cmd As ULCommand = new ULCommand( _ "UPDATE Departments" _ + " SET DepartmentName = 'Engineering'" _ + " WHERE DepartmentID=100", _ conn _ ) Dim res As IAsyncResult = _ cmd.BeginExecuteNonQuery( _ callbackFunction, cmd _ ) ' Perform other work. The callback function ' is called when the command completes. End Sub |
The following code is the C# language equivalent:
// C# private void callbackFunction( IAsyncResult ar ) { ULCommand cmd = (ULCommand) ar.AsyncState; // This won't block since the command has completed. int rowCount = cmd.EndExecuteNonQuery(); } // Elsewhere in the code private void DoStuff() { ULCommand cmd = new ULCommand( "UPDATE Departments" + " SET DepartmentName = 'Engineering'" + " WHERE DepartmentID=100", conn ); IAsyncResult res = cmd.BeginExecuteNonQuery( callbackFunction, cmd ); // Perform other work. The callback function // is called when the command completes. } |
The callback function executes in a separate thread, so the usual caveats related to updating the user interface in a threaded program apply.
Discuss this page in DocCommentXchange.
|
Copyright © 2012, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.1 |