Questo articolo è stato tradotto automaticamente. Per visualizzare l'articolo in inglese, selezionare la casella di controllo Inglese. È possibile anche visualizzare il testo inglese in una finestra popup posizionando il puntatore del mouse sopra il testo.
Traduzione
Inglese

Metodo SqlCommand.BeginExecuteReader ()

 

Data di pubblicazione: ottobre 2016

Avvia l'esecuzione asincrona dell'istruzione Transact-SQL o della stored procedure descritta da SqlCommand e recupera uno o più set di risultati dal server.

Spazio dei nomi:   System.Data.SqlClient
Assembly:  System.Data (in System.Data.dll)

[HostProtectionAttribute(SecurityAction.LinkDemand, ExternalThreading = true)]
public IAsyncResult BeginExecuteReader()

Valore restituito

Type: System.IAsyncResult

Oggetto IAsyncResult che può essere usato per eseguire il polling, attendere i risultati o entrambe le cose. Questo valore è necessario anche per chiamare il metodo EndExecuteReader, che restituisce un'istanza SqlDataReader utilizzabile per recuperare le righe restituite.

Exception Condition
InvalidCastException

È stato usato un valore SqlDbType diverso da Binary o VarBinary quando Value è stato impostato su Stream. Per ulteriori informazioni sul flusso, vedere Supporto del flusso SqlClient.

È stato usato un valore SqlDbType diverso da Char, NChar, NVarChar, VarChar o Xml quando Value è stato impostato su TextReader.

È stato usato un valore SqlDbType diverso da Xml quando Value è stato impostato su XmlReader.

SqlException

Qualsiasi errore che si è verificato durante l'esecuzione del testo del comando.

Si è verificato un timeout durante un'operazione di flusso. Per ulteriori informazioni sul flusso, vedere Supporto del flusso SqlClient.

InvalidOperationException

La coppia nome/valore "Asynchronous Processing=true" non è stata inclusa nella stringa di connessione che definisce la connessione per SqlCommand.

L'elemento SqlConnection chiuso o eliminato durante l'operazione di flusso. Per ulteriori informazioni sul flusso, vedere Supporto del flusso SqlClient.

IOException

Errore nell'oggetto Stream, XmlReader o TextReader durante un'operazione di flusso. Per ulteriori informazioni sul flusso, vedere Supporto del flusso SqlClient.

ObjectDisposedException

L'oggetto Stream, XmlReader o TextReader è stato chiuso durante l'operazione di flusso. Per ulteriori informazioni sul flusso, vedere Supporto del flusso SqlClient.

Il BeginExecuteReader metodo avvia il processo di esecuzione in modo asincrono un'istruzione Transact-SQL o stored procedure che restituisce righe, in modo che sia possibile eseguire altre attività contemporaneamente a quella dell'istruzione. Quando l'istruzione è stata completata, gli sviluppatori devono chiamare il EndExecuteReader per completare l'operazione e recuperare il SqlDataReader restituito dal comando. Il BeginExecuteReader metodo viene restituito immediatamente, ma fino a quando non viene eseguito il codice corrispondente EndExecuteReader chiamata al metodo, non è necessario eseguire altre chiamate che iniziano con un'esecuzione sincrona o asincrona sullo stesso SqlCommand oggetto. La chiamata di EndExecuteReader prima dell'esecuzione del comando completamento causa il SqlCommand blocco oggetto fino al completamento dell'esecuzione.

Si noti che il testo del comando e parametri vengono inviati al server in modo sincrono. Se un comando di grandi dimensioni o numerosi parametri vengono inviati, questo metodo si blocchi durante la scrittura. Una volta inviato il comando, viene restituito immediatamente senza attendere una risposta dal server, vale a dire letture sono asincrone. Sebbene l'esecuzione del comando è asincrono, il recupero dei valori è sincrono. Ciò significa che le chiamate a Read possono venire bloccate se sono necessari ulteriori dati e di rete sottostante operazione di lettura.

Poiché questo overload non supporta una routine di callback, gli sviluppatori devono entrambi eseguano il polling per determinare se il comando è stata completata, tramite il IsCompleted proprietà del IAsyncResult restituito dal BeginExecuteReader metodo; o attendere il completamento di uno o più comandi usando il AsyncWaitHandle proprietà dell'oggetto restituito IAsyncResult.

Se si utilizza ExecuteReader o BeginExecuteReader per accedere ai dati XML, SQL Server restituirà i risultati XML maggiori di 2033 caratteri in lunghezza espressa in righe multiple di 2033 caratteri. Per evitare questo comportamento, utilizzare ExecuteXmlReader o BeginExecuteXmlReader per leggere le query FOR XML. Per ulteriori informazioni, vedere l'articolo Q310378, "PRB: XML dati viene troncato quando si usa SqlDataReader," nella Microsoft Knowledge Base all'http://support.microsoft.com.

La seguente applicazione console avvia il processo di recupero di un lettore di dati in modo asincrono. In attesa dei risultati, questa semplice applicazione rimane in un ciclo, analizzando il IsCompleted valore della proprietà. Non appena il processo è completato, il codice recupera la SqlDataReader e visualizzarne il contenuto.

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.");
        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} ", 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. 

        // 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";
    }
}

.NET Framework
Disponibile da 2.0
Torna all'inizio
Mostra: