diff --git a/doc/samples/SqlCommand_BeginExecuteReader.cs b/doc/samples/SqlCommand_BeginExecuteReader.cs
new file mode 100644
index 0000000000..00f42fa9ce
--- /dev/null
+++ b/doc/samples/SqlCommand_BeginExecuteReader.cs
@@ -0,0 +1,100 @@
+//
+using System;
+using Microsoft.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.");
+ Console.ReadLine();
+ }
+
+ 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))
+ {
+ try
+ {
+ SqlCommand command = new SqlCommand(commandText, connection);
+
+ connection.Open();
+ 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.
+ System.Threading.Thread.Sleep(100);
+ }
+
+ using (SqlDataReader reader = command.EndExecuteReader(result))
+ {
+ DisplayResults(reader);
+ }
+ }
+ 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}\t", reader.GetValue(i));
+ }
+ Console.WriteLine();
+ }
+ }
+
+ private static string GetConnectionString()
+ {
+ // To avoid storing the connection string in your code,
+ // you can retrieve it from a configuration file.
+
+ return "Data Source=(local);Integrated Security=true;" +
+ "Initial Catalog=AdventureWorks";
+ }
+}
+//
\ No newline at end of file
diff --git a/doc/snippets/Microsoft.Data.SqlClient/SqlCommand.xml b/doc/snippets/Microsoft.Data.SqlClient/SqlCommand.xml
index 73a21bd60b..db553835e6 100644
--- a/doc/snippets/Microsoft.Data.SqlClient/SqlCommand.xml
+++ b/doc/snippets/Microsoft.Data.SqlClient/SqlCommand.xml
@@ -1173,7 +1173,106 @@
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 property value. As soon as the process has completed, the code retrieves the and displays its contents.
-
+
+ using System;
+ using Microsoft.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.");
+ Console.ReadLine();
+ }
+
+ 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))
+ {
+ try
+ {
+ SqlCommand command = new SqlCommand(commandText, connection);
+
+ connection.Open();
+ 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.
+ System.Threading.Thread.Sleep(100);
+ }
+
+ using (SqlDataReader reader = command.EndExecuteReader(result))
+ {
+ DisplayResults(reader);
+ }
+ }
+ 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}\t", reader.GetValue(i));
+ }
+ Console.WriteLine();
+ }
+ }
+
+ private static string GetConnectionString()
+ {
+ // To avoid storing the connection string in your code,
+ // you can retrieve it from a configuration file.
+
+ return "Data Source=(local);Integrated Security=true;" +
+ "Initial Catalog=AdventureWorks";
+ }
+ }
+