BeginExecuteReader Method ()

SqlCommand.BeginExecuteReader Method ()

Note: This method is new in the .NET Framework version 2.0.

Initiates the asynchronous execution of the Transact-SQL statement or stored procedure that is described by this SqlCommand, and retrieves one or more result sets from the server.

Namespace: System.Data.SqlClient
Assembly: System.Data (in

public IAsyncResult BeginExecuteReader ()
public IAsyncResult BeginExecuteReader ()
public function BeginExecuteReader () : IAsyncResult

Return Value

An IAsyncResult that can be used to poll or wait for results, or both; this value is also needed when invoking EndExecuteReader, which returns a SqlDataReader instance that can be used to retrieve the returned rows.

Exception typeCondition


Any error that occurred while executing the command text.


The name/value pair "Asynchronous Processing=true" was not included within the connection string defining the connection for this SqlCommand.

The BeginExecuteReader method starts the process of asynchronously executing a Transact-SQL statement or stored procedure that returns rows, so that other tasks can run concurrently while the statement is executing. When the statement has completed, developers must call the EndExecuteReader method to finish the operation and retrieve the SqlDataReader returned by the command. The BeginExecuteReader method returns immediately, but until the code executes the corresponding EndExecuteReader method call, it must not execute any other calls that start a synchronous or asynchronous execution against the same SqlCommand object. Calling the EndExecuteReader before the command's execution is completed causes the SqlCommand object to block until the execution is finished.

Note that the command text and parameters are sent to the server synchronously. If a large command or many parameters are sent, this method may block during writes. After the command is sent, the method returns immediately without waiting for an answer from the server--that is, reads are asynchronous. Although command execution is asynchronous, value fetching is still synchronous. This means that calls to Read may block if more data is required and the underlying network's read operation blocks.

Because this overload does not support a callback procedure, developers must either poll to determine whether the command has completed, using the IsCompleted property of the IAsyncResult returned by the BeginExecuteReader method; or wait for the completion of one or more commands using the AsyncWaitHandle property of the returned IAsyncResult.

If you use ExecuteReader or BeginExecuteReader to access XML data, SQL Server will return any XML results greater than 2,033 characters in length in multiple rows of 2,033 characters each. To avoid this behavior, use ExecuteXmlReader or BeginExecuteXmlReader to read FOR XML queries. For more information, see article Q310378, "PRB: XML Data Is Truncated When You Use SqlDataReader," in the Microsoft Knowledge Base at

The following console application starts the process of retrieving a data reader asynchronously. While waiting for the results, this simple application sits in a loop, investigating the IsCompleted property value. As soon as the process has completed, the code retrieves the SqlDataReader and displays its contents.

using System.Data.SqlClient;

class Class1
    static void Main()
        // This is a simple example that demonstrates the usage of the 
        // BeginExecuteReader functionality
        // The WAITFOR statement simply adds enough time to prove the 
        // asynchronous nature of the command.
        string commandText =
            "WAITFOR DELAY '00:00:03';" +
            "SELECT LastName, FirstName FROM Person.Contact " +
            "WHERE LastName LIKE 'M%'";

        RunCommandAsynchronously(commandText, GetConnectionString());

        Console.WriteLine("Press ENTER to continue.");

    private static void RunCommandAsynchronously(
        string commandText, string connectionString)
        // Given command text and connection string, asynchronously execute
        // the specified command against the connection. For this example,
        // the code displays an indicator as it is working, verifying the 
        // asynchronous behavior. 
        using (SqlConnection connection = new SqlConnection(connectionString))
                SqlCommand command = new SqlCommand(commandText, connection);

                IAsyncResult result = command.BeginExecuteReader();

                // Although it is not necessary, the following code
                // displays a counter in the console window, indicating that 
                // the main thread is not blocked while awaiting the command 
                // results.
                int count = 0;
                while (!result.IsCompleted)
                    count += 1;
                    Console.WriteLine("Waiting ({0)", count);
                    // Wait for 1/10 second, so the counter
                    // does not consume all available resources 
                    // on the main thread.

                using (SqlDataReader reader = command.EndExecuteReader(result))
            catch (SqlException ex)
                Console.WriteLine("Error ({0): {1", ex.Number, ex.Message);
            catch (InvalidOperationException ex)
                Console.WriteLine("Error: {0", ex.Message);
            catch (Exception ex)
                // You might want to pass these errors
                // back out to the caller.
                Console.WriteLine("Error: {0", ex.Message);

    private static void DisplayResults(SqlDataReader reader)
        // Display the data within the reader.
        while (reader.Read())
            // Display all the columns. 
            for (int i = 0; i < reader.FieldCount; i++)
                Console.Write("{0 ", reader.GetValue(i));

    private static string GetConnectionString()
        // To avoid storing the connection string in your code,            
        // you can retrieve it from a configuration file. 

        // If you have not included "Asynchronous Processing=true" in the
        // connection string, the command is not able
        // to execute asynchronously.
        return "Data Source=(local);Integrated Security=true;" +
            "Initial Catalog=AdventureWorks; Asynchronous Processing=true";

Windows 98, Windows 2000 SP4, Windows Millennium Edition, Windows Server 2003, Windows XP Media Center Edition, Windows XP Professional x64 Edition, Windows XP SP2, Windows XP Starter Edition

The .NET Framework does not support all versions of every platform. For a list of the supported versions, see System Requirements.

.NET Framework

Supported in: 2.0

Community Additions

© 2015 Microsoft