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.BeginExecuteNonQuery ()

 

Data di pubblicazione: ottobre 2016

Avvia l'esecuzione asincrona dell'istruzione Transact-SQL o della stored procedure descritta da SqlCommand.

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

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

Valore restituito

Type: System.IAsyncResult

Oggetto IAsyncResult che può essere usato per eseguire il polling, attendere i risultati o entrambe le operazioni. Questo valore è necessario anche per chiamare il metodo EndExecuteNonQuery, che restituisce il numero delle righe interessate.

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 BeginExecuteNonQuery metodo avvia il processo di esecuzione in modo asincrono un Transact-SQL istruzione o stored procedure che restituiscono righe, in modo che sia possibile eseguire altre attività contemporaneamente a quella dell'istruzione. Quando l'istruzione è stata completata, gli sviluppatori devono chiamare il EndExecuteNonQuery metodo per completare l'operazione. Il BeginExecuteNonQuery metodo restituisce immediatamente (CommandTimeout non ha alcun effetto BeginExecuteNonQuery), ma fino a quando non viene eseguito il codice corrispondente EndExecuteNonQuery chiamata al metodo, non è necessario eseguire altre chiamate che iniziano con un'esecuzione sincrona o asincrona sullo stesso SqlCommand oggetto. La chiamata di EndExecuteNonQuery 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.

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 BeginExecuteNonQuery metodo; o attendere il completamento di uno o più comandi usando il AsyncWaitHandle proprietà dell'oggetto restituito IAsyncResult.

La seguente applicazione console crea aggiornamento dei dati all'interno di AdventureWorks database di esempio, in modo asincrono. Per emulare un processo a esecuzione prolungata, in questo esempio viene inserita un'istruzione WAITFOR nel testo del comando. In genere, non è necessario impegno per migliorare i comandi di esecuzione più lenta, ma in questo caso diventa così più semplice illustrare il comportamento asincrono.

using System.Data.SqlClient;

class Class1
{
    static void Main()
    {
        // This is a simple example that demonstrates the usage of the 
        // BeginExecuteNonQuery functionality.
        // The WAITFOR statement simply adds enough time to prove the 
        // asynchronous nature of the command.

        string commandText = 
            "UPDATE Production.Product SET ReorderPoint = ReorderPoint + 1 " + 
            "WHERE ReorderPoint Is Not Null;" + 
            "WAITFOR DELAY '0:0:3';" + 
            "UPDATE Production.Product SET ReorderPoint = ReorderPoint - 1 " + 
            "WHERE ReorderPoint Is Not Null";

        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
            {
                int count = 0;
                SqlCommand command = new SqlCommand(commandText, connection);
                connection.Open();

                IAsyncResult result = command.BeginExecuteNonQuery();
                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);
                }
                Console.WriteLine("Command complete. Affected {0} rows.", 
                    command.EndExecuteNonQuery(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 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=SSPI;" +
            "Initial Catalog=AdventureWorks; Asynchronous Processing=true";
    } 
}

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