SqlCommand.BeginExecuteXmlReader Metódus

Definíció

Elindítja a Transact-SQL utasítás vagy a tárolt eljárás aszinkron végrehajtását, amelyet ez a SqlCommand ír le, és az eredményeket XmlReader objektumként adja vissza.

Túlterhelések

Name Description
BeginExecuteXmlReader()

Elindítja a Transact-SQL utasítás vagy a tárolt eljárás aszinkron végrehajtását, amelyet ez a SqlCommand ír le, és az eredményeket XmlReader objektumként adja vissza.

BeginExecuteXmlReader(AsyncCallback, Object)

Kezdeményezi a Transact-SQL utasítás vagy a tárolt eljárás aszinkron végrehajtását, amelyet ez a SqlCommand ír le, és visszahívási eljárással XmlReader objektumként adja vissza az eredményeket.

BeginExecuteXmlReader()

Forrás:
System.Data.SqlClient.notsupported.cs

Elindítja a Transact-SQL utasítás vagy a tárolt eljárás aszinkron végrehajtását, amelyet ez a SqlCommand ír le, és az eredményeket XmlReader objektumként adja vissza.

public:
 IAsyncResult ^ BeginExecuteXmlReader();
public IAsyncResult BeginExecuteXmlReader();
member this.BeginExecuteXmlReader : unit -> IAsyncResult
Public Function BeginExecuteXmlReader () As IAsyncResult

Válaszok

Egy IAsyncResult olyan érték, amely az eredmények lekérdezésére vagy várakozására használható, vagy mindkettőre; erre az értékre is szükség van a meghíváskor EndExecuteXmlReader, amely egyetlen XML-értéket ad vissza.

Kivételek

A SqlDbTypebináristól vagy a VarBinarytól eltérő függvényt használt a rendszer, amikor Value a beállítás értéke Stream. A streamelésről további információt az SqlClient streamelési támogatásában talál.

-vagy-

A SqlDbTypechar, NChar, NVarChar, VarChar vagy Xml kivételével más is használható volt a beállításnál ValueTextReader.

-vagy-

Az SqlDbTypeXml-fájltól eltérő érték lett használva a ValuebeállításkorXmlReader.

Bármilyen hiba, amely a parancsszöveg végrehajtása során történt.

-vagy-

Időtúllépés történt egy streamelési művelet során. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Az "Aszinkron processing=true" név-érték pár nem szerepel a kapcsolati karakterlánc, amely meghatározza a SqlCommand kapcsolatát.

-vagy-

A SqlConnection streamelési művelet során bezárt vagy elvetett. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Hiba történt egy Stream, XmlReader vagy TextReader objektumban egy streamelési művelet során. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Az Stream, XmlReader vagy TextReader objektum egy streamelési művelet során lett bezárva. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Példák

Az alábbi konzolalkalmazás elindítja az XML-adatok aszinkron beolvasásának folyamatát. Miközben az eredményekre vár, ez az egyszerű alkalmazás egy hurokban ül, és megvizsgálja a IsCompleted tulajdonság értékét. A folyamat befejezése után a kód lekéri az XML-t, és megjeleníti annak tartalmát.

using System.Data.SqlClient;
using System.Xml;

class Class1
{
    static void Main()
    {
        // This example is not terribly effective, but it proves a point.
        // The WAITFOR statement simply adds enough time to prove the
        // asynchronous nature of the command.
        string commandText =
            "WAITFOR DELAY '00:00:03';" +
            "SELECT Name, ListPrice FROM Production.Product " +
            "WHERE ListPrice < 100 " +
            "FOR XML AUTO, XMLDATA";

        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))
        {
            SqlCommand command = new SqlCommand(commandText, connection);

            connection.Open();
            IAsyncResult result = command.BeginExecuteXmlReader();

            // Although it is not necessary, the following procedure
            // 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)
            {
                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);
            }

            XmlReader reader = command.EndExecuteXmlReader(result);
            DisplayProductInfo(reader);
        }
    }

    private static void DisplayProductInfo(XmlReader reader)
    {
        // Display the data within the reader.
        while (reader.Read())
        {
            // Skip past items that are not from the correct table.
            if (reader.LocalName.ToString() == "Production.Product")
            {
                Console.WriteLine("{0}: {1:C}",
                    reader["Name"], Convert.ToSingle(reader["ListPrice"]));
            }
        }
    }

    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";
    }
}
Imports System.Data.SqlClient
Imports System.Xml

Module Module1

    Sub Main()
        ' This example is not terribly effective, but it proves a point.
        ' The WAITFOR statement simply adds enough time to prove the 
        ' asynchronous nature of the command.
        Dim commandText As String = _
         "WAITFOR DELAY '00:00:03';" & _
         "SELECT Name, ListPrice FROM Production.Product " & _
         "WHERE ListPrice < 100 " & _
         "FOR XML AUTO, XMLDATA"

        RunCommandAsynchronously(commandText, GetConnectionString())

        Console.WriteLine("Press ENTER to continue.")
        Console.ReadLine()
    End Sub

    Private Sub RunCommandAsynchronously( _
     ByVal commandText As String, ByVal connectionString As String)

        ' 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 connection As New SqlConnection(connectionString)
            Try
                Dim command As New SqlCommand(commandText, connection)
                connection.Open()
                Dim result As IAsyncResult = command.BeginExecuteXmlReader()

                ' Although it is not necessary, the following procedure
                ' displays a counter in the console window, indicating that 
                ' the main thread is not blocked while awaiting the command 
                ' results.
                Dim count As Integer = 0
                While Not 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.
                    Threading.Thread.Sleep(100)
                End While

                Using reader As XmlReader = command.EndExecuteXmlReader(result)
                    DisplayProductInfo(reader)
                End Using
            Catch ex As SqlException
                Console.WriteLine("Error ({0}): {1}", ex.Number, ex.Message)
            Catch ex As InvalidOperationException
                Console.WriteLine("Error: {0}", ex.Message)
            Catch ex As Exception
                ' You might want to pass these errors
                ' back out to the caller.
                Console.WriteLine("Error: {0}", ex.Message)
            End Try
        End Using
    End Sub

    Private Sub DisplayProductInfo(ByVal reader As XmlReader)
        ' Display the data within the reader.
        While reader.Read()
            ' Skip past items that are not from the correct table.
            If reader.LocalName.ToString = "Production.Product" Then
                Console.WriteLine("{0}: {1:C}", _
                 reader("Name"), CSng(reader("ListPrice")))
            End If
        End While
    End Sub

    Private Function GetConnectionString() As String
        ' 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"
    End Function
End Module

Megjegyzések

A BeginExecuteXmlReader metódus elindítja a sorokat XML-ként visszaadó Transact-SQL utasítás aszinkron végrehajtásának folyamatát, hogy más feladatok párhuzamosan fussanak az utasítás végrehajtása közben. Amikor az utasítás befejeződött, a fejlesztőknek meg kell hívniuk a metódust a EndExecuteXmlReader művelet befejezéséhez és a parancs által visszaadott XML lekéréséhez. A BeginExecuteXmlReader metódus azonnal visszatér, de amíg a kód nem hajtja végre a megfelelő EndExecuteXmlReader metódushívást, nem hajthat végre más hívásokat, amelyek szinkron vagy aszinkron végrehajtást indítanak ugyanahhoz SqlCommand az objektumhoz. Ha a EndExecuteXmlReader parancs végrehajtása előtt hívja meg az objektumot, az SqlCommand a végrehajtás befejezéséig blokkolódik.

A CommandText tulajdonság általában egy érvényes FOR XML záradékkal rendelkező Transact-SQL utasítást ad meg. Megadhat azonban egy utasítást is, CommandText amely érvényes XML-t tartalmazó adatokat ad vissza ntext .

Egy tipikus BeginExecuteXmlReader lekérdezés a következő C#-példa szerint formázható:

SqlCommand command = new SqlCommand("SELECT ContactID, FirstName, LastName FROM dbo.Contact FOR XML AUTO, XMLDATA", SqlConn);

Ez a módszer egysoros, egyoszlopos eredményhalmaz lekérésére is használható. Ebben az esetben, ha egynél több sort ad vissza, a EndExecuteXmlReader metódus az első sor értékét csatolja XmlReader , és elveti az eredményhalmaz többi részét.

A több aktív eredményhalmaz (MARS) funkcióval több művelet is ugyanazt a kapcsolatot használhatja.

Vegye figyelembe, hogy a parancs szövegét és paramétereit a rendszer szinkron módon küldi el a kiszolgálónak. Ha nagy parancsot vagy több paramétert küld, ez a módszer blokkolhatja az írások során. A parancs elküldése után a metódus azonnal visszatér, anélkül, hogy választ vár a kiszolgálótól – vagyis az olvasások aszinkronok. Bár a parancsvégrehajtás aszinkron, az értéklekérés továbbra is szinkron.

Mivel ez a túlterhelés nem támogatja a visszahívási eljárást, a fejlesztőknek vagy le kell kérni a lekérdezést annak megállapításához, hogy a parancs befejeződött-e a metódus által IsCompleted visszaadott tulajdonság IAsyncResult használatávalBeginExecuteXmlReader, vagy várniuk kell egy vagy több parancs befejezésére a AsyncWaitHandle visszaadott IAsyncResulttulajdonság használatával.

Ha ExecuteReader vagy BeginExecuteReader használatával fér hozzá az XML-adatokhoz, SQL Server 2033 karakternél hosszabb XML-eredményeket ad vissza több, egyenként 2033 karakter hosszúságú sorban. Ennek a viselkedésnek a elkerülése érdekében használja ExecuteXmlReader vagy BeginExecuteXmlReader olvassa el a FOR XML-lekérdezéseket.

Ez a metódus figyelmen kívül hagyja a tulajdonságot CommandTimeout .

Lásd még

A következőre érvényes:

BeginExecuteXmlReader(AsyncCallback, Object)

Forrás:
System.Data.SqlClient.notsupported.cs

Kezdeményezi a Transact-SQL utasítás vagy a tárolt eljárás aszinkron végrehajtását, amelyet ez a SqlCommand ír le, és visszahívási eljárással XmlReader objektumként adja vissza az eredményeket.

public:
 IAsyncResult ^ BeginExecuteXmlReader(AsyncCallback ^ callback, System::Object ^ stateObject);
public IAsyncResult BeginExecuteXmlReader(AsyncCallback callback, object stateObject);
member this.BeginExecuteXmlReader : AsyncCallback * obj -> IAsyncResult
Public Function BeginExecuteXmlReader (callback As AsyncCallback, stateObject As Object) As IAsyncResult

Paraméterek

callback
AsyncCallback

Egy AsyncCallback meghatalmazott, amelyet a parancs végrehajtása után hív meg a rendszer. Adja át a null (Nothing a Microsoft Visual Basic)-ban, hogy jelezze, nincs szükség visszahívásra.

stateObject
Object

A visszahívási eljárásnak átadott, felhasználó által definiált állapotobjektum. Kérje le ezt az objektumot a visszahívási eljárásból a AsyncState tulajdonság használatával.

Válaszok

A IAsyncResult lekérdezéshez, az eredmények várakozásához vagy mindkettőhöz használható érték. Erre az EndExecuteXmlReader(IAsyncResult) értékre a meghíváskor is szükség van, amely XML-ként adja vissza a parancs eredményeit.

Kivételek

A SqlDbTypebináristól vagy a VarBinarytól eltérő függvényt használt a rendszer, amikor Value a beállítás értéke Stream. A streamelésről további információt az SqlClient streamelési támogatásában talál.

-vagy-

A SqlDbTypechar, NChar, NVarChar, VarChar vagy Xml kivételével más is használható volt a beállításnál ValueTextReader.

-vagy-

Az SqlDbTypeXml-fájltól eltérő érték lett használva a ValuebeállításkorXmlReader.

Bármilyen hiba, amely a parancsszöveg végrehajtása során történt.

-vagy-

Időtúllépés történt egy streamelési művelet során. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Az "Aszinkron processing=true" név-érték pár nem szerepel a kapcsolati karakterlánc, amely meghatározza a SqlCommand kapcsolatát.

-vagy-

A SqlConnection streamelési művelet során bezárt vagy elvetett. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Hiba történt egy Stream, XmlReader vagy TextReader objektumban egy streamelési művelet során. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Az Stream, XmlReader vagy TextReader objektum egy streamelési művelet során lett bezárva. A streamelésről további információt az SqlClient streamelési támogatásában talál.

Példák

A következő Windows-alkalmazás bemutatja a BeginExecuteXmlReader metódus használatát, és végrehajt egy Transact-SQL utasítást, amely néhány másodperces késleltetést tartalmaz (hosszú ideig futó parancsot emulál). Ez a példa paraméterként adja át a végrehajtó SqlCommand objektumot, így egyszerűen lekérheti az stateObject objektumot a visszahívási eljáráson belül, hogy a kód meghívhassa a SqlCommand kezdeti hívásnak megfelelő metódustEndExecuteXmlReader.BeginExecuteXmlReader

Ez a példa számos fontos technikát mutat be. Ez magában foglalja egy metódus meghívását, amely egy külön szálból használja az űrlapot. Ez a példa azt is bemutatja, hogyan kell megakadályoznia, hogy a felhasználók egyszerre többször hajtsanak végre parancsokat, és hogyan kell meggyőződnie arról, hogy az űrlap nem záródik be a visszahívási eljárás meghívása előtt.

A példa beállításához hozzon létre egy új Windows-alkalmazást. Helyezzen egy vezérlőt Button , egy vezérlőt ListBox és egy vezérlőelemet Label az űrlapra (elfogadva az egyes vezérlők alapértelmezett nevét). Adja hozzá az alábbi kódot az űrlap osztályához, és módosítsa a környezethez szükséges kapcsolati karakterlánc.

using System.Data.SqlClient;
using System.Xml;

namespace Microsoft.AdoDotNet.CodeSamples
{
    public partial class Form1 : Form
    {
        // Hook up the form's Load event handler and then add
        // this code to the form's class:
        // You need these delegates in order to display text from a thread
        // other than the form's thread. See the HandleCallback
        // procedure for more information.
        private delegate void DisplayInfoDelegate(string Text);
        private delegate void DisplayReaderDelegate(XmlReader reader);

        private bool isExecuting;

        // This example maintains the connection object
        // externally, so that it is available for closing.
        private SqlConnection connection;

        public Form1()
        {
            InitializeComponent();
        }

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

            // If you do not include the Asynchronous Processing=true name/value pair,
            // you wo not be able to execute the command asynchronously.
            return "Data Source=(local);Integrated Security=true;" +
            "Initial Catalog=AdventureWorks; Asynchronous Processing=true";
        }

        private void DisplayStatus(string Text)
        {
            this.label1.Text = Text;
        }

        private void ClearProductInfo()
        {
            // Clear the list box.
            this.listBox1.Items.Clear();
        }

        private void DisplayProductInfo(XmlReader reader)
        {
            // Display the data within the reader.
            while (reader.Read())
            {
                // Skip past items that are not from the correct table.
                if (reader.LocalName.ToString() == "Production.Product")
                {
                    this.listBox1.Items.Add(String.Format("{0}: {1:C}",
                        reader["Name"], Convert.ToDecimal(reader["ListPrice"])));
                }
            }
            DisplayStatus("Ready");
        }

        private void Form1_FormClosing(object sender,
            System.Windows.Forms.FormClosingEventArgs e)
        {
            if (isExecuting)
            {
                MessageBox.Show(this, "Cannot close the form until " +
                    "the pending asynchronous command has completed. Please wait...");
                e.Cancel = true;
            }
        }

        private void button1_Click(object sender, System.EventArgs e)
        {
            if (isExecuting)
            {
                MessageBox.Show(this,
                    "Already executing. Please wait until the current query " +
                    "has completed.");
            }
            else
            {
                SqlCommand command = null;
                try
                {
                    ClearProductInfo();
                    DisplayStatus("Connecting...");
                    connection = new SqlConnection(GetConnectionString());

                    // To emulate a long-running query, wait for
                    // a few seconds before working with the data.
                    string commandText =
                        "WAITFOR DELAY '00:00:03';" +
                        "SELECT Name, ListPrice FROM Production.Product " +
                        "WHERE ListPrice < 100 " +
                        "FOR XML AUTO, XMLDATA";

                    command = new SqlCommand(commandText, connection);
                    connection.Open();

                    DisplayStatus("Executing...");
                    isExecuting = true;
                    // Although it is not required that you pass the
                    // SqlCommand object as the second parameter in the
                    // BeginExecuteXmlReader call, doing so makes it easier
                    // to call EndExecuteXmlReader in the callback procedure.
                    AsyncCallback callback = new AsyncCallback(HandleCallback);
                    command.BeginExecuteXmlReader(callback, command);
                }
                catch (Exception ex)
                {
                    isExecuting = false;
                    DisplayStatus(string.Format("Ready (last error: {0})", ex.Message));
                    if (connection != null)
                    {
                        connection.Close();
                    }
                }
            }
        }

        private void HandleCallback(IAsyncResult result)
        {
            try
            {
                // Retrieve the original command object, passed
                // to this procedure in the AsyncState property
                // of the IAsyncResult parameter.
                SqlCommand command = (SqlCommand)result.AsyncState;
                XmlReader reader = command.EndExecuteXmlReader(result);

                // You may not interact with the form and its contents
                // from a different thread, and this callback procedure
                // is all but guaranteed to be running from a different thread
                // than the form.

                // Instead, you must call the procedure from the form's thread.
                // One simple way to accomplish this is to call the Invoke
                // method of the form, which calls the delegate you supply
                // from the form's thread.
                DisplayReaderDelegate del = new DisplayReaderDelegate(DisplayProductInfo);
                this.Invoke(del, reader);
            }
            catch (Exception ex)
            {
                // Because you are now running code in a separate thread,
                // if you do not handle the exception here, none of your other
                // code catches the exception. Because none of
                // your code is on the call stack in this thread, there is nothing
                // higher up the stack to catch the exception if you do not
                // handle it here. You can either log the exception or
                // invoke a delegate (as in the non-error case in this
                // example) to display the error on the form. In no case
                // can you simply display the error without executing a delegate
                // as in the try block here.

                // You can create the delegate instance as you
                // invoke it, like this:
                this.Invoke(new DisplayInfoDelegate(DisplayStatus),
                String.Format("Ready(last error: {0}", ex.Message));
            }
            finally
            {
                isExecuting = false;
                if (connection != null)
                {
                    connection.Close();
                }
            }
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            this.button1.Click += new System.EventHandler(this.button1_Click);
            this.FormClosing += new System.Windows.Forms.
                FormClosingEventHandler(this.Form1_FormClosing);
        }
    }
}
Imports System.Data.SqlClient
Imports System.Windows.Forms
Imports System.Xml

Public Class Form1
    ' Add this code to the form's class:
    ' You need these delegates in order to display text from a thread
    ' other than the form's thread. See the HandleCallback
    ' procedure for more information.
    Private Delegate Sub DisplayInfoDelegate(ByVal Text As String)
    Private Delegate Sub DisplayReaderDelegate(ByVal reader As XmlReader)

    Private isExecuting As Boolean

    ' This example maintains the connection object 
    ' externally, so that it is available for closing.
    Private connection As SqlConnection

    Private Function GetConnectionString() As String
        ' 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"
    End Function

    Private Sub DisplayStatus(ByVal Text As String)
        Me.Label1.Text = Text
    End Sub

    Private Sub ClearProductInfo()
        ' Clear the list box.
        Me.ListBox1.Items.Clear()
    End Sub

    Private Sub DisplayProductInfo(ByVal reader As XmlReader)
        ' Display the data within the reader.
        While reader.Read()
            ' Skip past items that are not from the correct table.
            If reader.LocalName.ToString = "Production.Product" Then
                Me.ListBox1.Items.Add(String.Format("{0}: {1:C}", _
                    reader("Name"), CSng(reader("ListPrice"))))
            End If
        End While
        DisplayStatus("Ready")
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        If isExecuting Then
            MessageBox.Show(Me, "Cannot close the form until " & _
                "the pending asynchronous command has completed. Please wait...")
            e.Cancel = True
        End If
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Button1.Click
        If isExecuting Then
            MessageBox.Show(Me, "Already executing. Please wait until the current query " & _
                "has completed.")
        Else
            Dim command As SqlCommand
            Try
                ClearProductInfo()
                DisplayStatus("Connecting...")
                connection = New SqlConnection(GetConnectionString())
                ' To emulate a long-running query, wait for 
                ' a few seconds before working with the data.
                Dim commandText As String = _
                    "WAITFOR DELAY '00:00:03';" & _
                    "SELECT Name, ListPrice " & _
                    "FROM Production.Product WHERE ListPrice < 100 " & _
                    "FOR XML AUTO, XMLDATA"

                command = New SqlCommand(commandText, connection)
                connection.Open()

                DisplayStatus("Executing...")
                isExecuting = True
                ' Although it is not required that you pass the 
                ' SqlCommand object as the second parameter in the 
                ' BeginExecuteXmlReader call, doing so makes it easier
                ' to call EndExecuteXmlReader in the callback procedure.
                Dim callback As New AsyncCallback(AddressOf HandleCallback)
                command.BeginExecuteXmlReader(callback, command)

            Catch ex As Exception
                isExecuting = False
                DisplayStatus(String.Format("Ready (last error: {0})", ex.Message))
                If connection IsNot Nothing Then
                    connection.Close()
                End If
            End Try
        End If
    End Sub

    Private Sub HandleCallback(ByVal result As IAsyncResult)
        Try
            ' Retrieve the original command object, passed
            ' to this procedure in the AsyncState property
            ' of the IAsyncResult parameter.
            Dim command As SqlCommand = CType(result.AsyncState, SqlCommand)
            Dim reader As XmlReader = command.EndExecuteXmlReader(result)

            ' You may not interact with the form and its contents
            ' from a different thread, and this callback procedure
            ' is all but guaranteed to be running from a different thread
            ' than the form. 

            ' Instead, you must call the procedure from the form's thread.
            ' One simple way to accomplish this is to call the Invoke
            ' method of the form, which calls the delegate you supply
            ' from the form's thread. 
            Dim del As New DisplayReaderDelegate(AddressOf DisplayProductInfo)
            Me.Invoke(del, reader)

        Catch ex As Exception
            ' Because you are now running code in a separate thread, 
            ' if you do not handle the exception here, none of your other
            ' code catches the exception. Because none of 
            ' your code is on the call stack in this thread, there is nothing
            ' higher up the stack to catch the exception if you do not 
            ' handle it here. You can either log the exception or 
            ' invoke a delegate (as in the non-error case in this 
            ' example) to display the error on the form. In no case
            ' can you simply display the error without executing a delegate
            ' as in the Try block here. 

            ' You can create the delegate instance as you 
            ' invoke it, like this:
            Me.Invoke(New DisplayInfoDelegate(AddressOf DisplayStatus), _
                String.Format("Ready(last error: {0}", ex.Message))
        Finally
            isExecuting = False
            If connection IsNot Nothing Then
                connection.Close()
            End If
        End Try
    End Sub
End Class

Megjegyzések

A BeginExecuteXmlReader metódus elindítja a sorokat XML-ként visszaadó Transact-SQL utasítás vagy tárolt eljárás aszinkron végrehajtásának folyamatát, hogy más feladatok párhuzamosan fussanak az utasítás végrehajtása közben. Az utasítás befejezése után a fejlesztőknek meg kell hívniuk a metódust a EndExecuteXmlReader művelet befejezéséhez és a kért XML-adatok lekéréséhez. A BeginExecuteXmlReader metódus azonnal visszatér, de amíg a kód nem hajtja végre a megfelelő EndExecuteXmlReader metódushívást, nem hajthat végre más hívásokat, amelyek szinkron vagy aszinkron végrehajtást indítanak ugyanahhoz SqlCommand az objektumhoz. Ha a EndExecuteXmlReader parancs végrehajtása előtt hívja meg az objektumot, az SqlCommand a végrehajtás befejezéséig blokkolódik.

A CommandText tulajdonság általában egy érvényes FOR XML záradékkal rendelkező Transact-SQL utasítást ad meg. Megadhat azonban egy utasítást is, CommandText amely érvényes XML-t tartalmazó adatokat ad vissza. Ez a módszer egysoros, egyoszlopos eredményhalmaz lekérésére is használható. Ebben az esetben, ha egynél több sort ad vissza, a EndExecuteXmlReader metódus az első sor értékét csatolja XmlReader , és elveti az eredményhalmaz többi részét.

Egy tipikus BeginExecuteXmlReader lekérdezés a következő C#-példa szerint formázható:

SqlCommand command = new SqlCommand("SELECT ContactID, FirstName, LastName FROM Contact FOR XML AUTO, XMLDATA", SqlConn);

Ez a módszer egysoros, egyoszlopos eredményhalmaz lekérésére is használható. Ebben az esetben, ha egynél több sort ad vissza, a EndExecuteXmlReader metódus az első sor értékét csatolja XmlReader , és elveti az eredményhalmaz többi részét.

A több aktív eredményhalmaz (MARS) funkcióval több művelet is ugyanazt a kapcsolatot használhatja.

A callback paraméter lehetővé teszi egy meghatalmazott megadását AsyncCallback , amelyet az utasítás befejezésekor hív meg. A metódust meghívhatja ezen a EndExecuteXmlReader delegálási eljáráson belül, vagy az alkalmazás bármely más helyről. Emellett a paraméter bármely stateObject objektumát átadhatja, a visszahívási eljárás pedig lekérheti ezeket az adatokat a AsyncState tulajdonság használatával.

Vegye figyelembe, hogy a parancs szövegét és paramétereit a rendszer szinkron módon küldi el a kiszolgálónak. Ha egy nagy parancsot vagy számos paramétert küld, ez a metódus blokkolhatja az írások során. A parancs elküldése után a metódus azonnal visszatér, anélkül, hogy választ vár a kiszolgálótól – vagyis az olvasások aszinkronok.

A művelet végrehajtása során előforduló összes hiba kivételként jelenik meg a visszahívási eljárásban. A kivételt a visszahívási eljárásban kell kezelnie, nem a fő alkalmazásban. A visszahívási eljárás kivételeinek kezelésével kapcsolatos további információkért tekintse meg a jelen témakörben található példát.

Ha ExecuteReader vagy BeginExecuteReader használatával fér hozzá az XML-adatokhoz, SQL Server minden 2033 karakternél hosszabb XML-eredményt ad vissza 2033 karakternél hosszabb sorokban, egyenként 2033 karakter hosszúságú sorokban. Ennek a viselkedésnek a elkerülése érdekében használja ExecuteXmlReader vagy BeginExecuteXmlReader olvassa el a FOR XML-lekérdezéseket.

Ez a metódus figyelmen kívül hagyja a tulajdonságot CommandTimeout .

Lásd még

A következőre érvényes: