SqlCommand::BeginExecuteXmlReader Method (AsyncCallback, Object)
Assembly: System.Data (in System.Data.dll)
[HostProtectionAttribute(SecurityAction::LinkDemand, ExternalThreading = true)] public: IAsyncResult^ BeginExecuteXmlReader( AsyncCallback^ callback, Object^ stateObject )
- Type: System::AsyncCallback
An AsyncCallback delegate that is invoked when the command's execution has completed. Pass nullptr (Nothing in Microsoft Visual Basic) to indicate that no callback is required.
Any error that occurred while executing the command text.
A timeout occurred during a streaming operation. For more information about streaming, see SqlClient Streaming Support.
The name/value pair "Asynchronous Processing=true" was not included within the connection string defining the connection for this SqlCommand.
The BeginExecuteXmlReader method starts the process of asynchronously executing a Transact-SQL statement or stored procedure that returns rows as XML, so that other tasks can run concurrently while the statement is executing. When the statement has completed, developers must call the EndExecuteXmlReader method to finish the operation and retrieve the requested XML data. The BeginExecuteXmlReader method returns immediately, but until the code executes the corresponding EndExecuteXmlReader method call, it must not execute any other calls that start a synchronous or asynchronous execution against the same SqlCommand object. Calling the EndExecuteXmlReader before the command's execution is completed causes the SqlCommand object to block until the execution is finished.
The CommandText property ordinarily specifies a Transact-SQL statement with a valid FOR XML clause. However, CommandText can also specify a statement that returns data that contains valid XML. This method can also be used to retrieve a single-row, single-column result set. In this case, if more than one row is returned, the EndExecuteXmlReader method attaches the XmlReader to the value on the first row, and discards the rest of the result set.
A typical BeginExecuteXmlReader query can be formatted as in the following C# example:
SqlCommand command = new SqlCommand("SELECT ContactID, FirstName, LastName FROM Contact FOR XML AUTO, XMLDATA", SqlConn);
This method can also be used to retrieve a single-row, single-column result set. In this case, if more than one row is returned, the EndExecuteXmlReader method attaches the XmlReader to the value on the first row, and discards the rest of the result set.
The multiple active result set (MARS) feature lets multiple actions use the same connection.
The callback parameter lets you specify an AsyncCallback delegate that is called when the statement has completed. You can call the EndExecuteXmlReader method from within this delegate procedure, or from any other location within your application. In addition, you can pass any object in the stateObject parameter, and your callback procedure can retrieve this information using the AsyncState property.
Note that the command text and parameters are sent to the server synchronously. If a large command or many parameters is 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.
All errors that occur during the execution of the operation are thrown as exceptions in the callback procedure. You must handle the exception in the callback procedure, not in the main application. See the example in this topic for additional information on handling exceptions in the callback procedure.
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 http://support.microsoft.com.
The HostProtectionAttribute attribute applied to this type or member has the following Resources property value: ExternalThreading. The HostProtectionAttribute does not affect desktop applications (which are typically started by double-clicking an icon, typing a command, or entering a URL in a browser). For more information, see the HostProtectionAttribute class or SQL Server Programming and Host Protection Attributes.
The following Windows application demonstrates the use of the BeginExecuteXmlReader method, executing a Transact-SQL statement that includes a delay of a few seconds (emulating a long-running command). This example passes the executing SqlCommand object as the stateObject parameter--doing so makes it simple to retrieve the SqlCommand object from within the callback procedure, so that the code can call the EndExecuteXmlReader method corresponding to the initial call to BeginExecuteXmlReader.
This example demonstrates many important techniques. This includes calling a method that interacts with the form from a separate thread. In addition, this example demonstrates how you must block users from executing a command multiple times concurrently, and how you must make sure that the form does not close before the callback procedure is called.
To set up this example, create a new Windows application. Put a Button control, a ListBox control, and a Label control on the form (accepting the default name for each control). Add the following code to the form's class, modifying the connection string as needed for your environment.
Windows 8.1, Windows Server 2012 R2, Windows 8, Windows Server 2012, Windows 7, Windows Vista SP2, Windows Server 2008 (Server Core Role not supported), Windows Server 2008 R2 (Server Core Role supported with SP1 or later; Itanium not supported)
The .NET Framework does not support all versions of every platform. For a list of the supported versions, see .NET Framework System Requirements.