Condividi tramite


Recuperare dati tramite un DataReader

Si applica a: .NET Framework .NET .NET Standard

Scarica ADO.NET

Per recuperare dati usando DataReader, creare un'istanza dell'oggetto Command e quindi creare DataReader chiamando Command.ExecuteReader per recuperare righe da un'origine dati. DataReader fornisce un flusso di dati non archiviati nel buffer che consente alla logica procedurale di elaborare sequenzialmente i risultati provenienti da un'origine dati.

Nota

L'uso di DataReader è consigliabile quando si recuperano grandi quantità di dati perché i dati non sono memorizzati nella cache.

L'esempio seguente illustra l'uso di DataReader in cui reader rappresenta un oggetto DataReader valido e command rappresenta un oggetto Command valido.

reader = command.ExecuteReader();  

Usare il metodo DataReader.Read per ottenere una riga dai risultati della query. È possibile accedere a ogni colonna della riga restituita passando il nome o il numero ordinale della colonna a DataReader. Per migliorare le prestazioni, tuttavia, DataReader fornisce una serie di metodi che consentono di accedere ai valori delle colonne nei tipi di dati nativi, quali GetDateTime, GetDouble, GetGuid, GetInt32 e così via. Per un elenco dei metodi delle funzioni di accesso tipizzate per DataReader specifici del provider di dati, vedere SqlDataReader. L'uso di metodi di funzioni di accesso tipizzate quando si conosce il tipo di dati sottostante riduce il numero di conversioni dei tipi necessarie al momento del recupero del valore della colonna.

L'esempio seguente scorre un oggetto DataReader e restituisce due colonne da ogni riga.

static void HasRows(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Check if the DataReader has any row.
        if (reader.HasRows)
        {
            // Obtain a row from the query result.
            while (reader.Read())
            {
                Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }
        }
        else
        {
            Console.WriteLine("No rows found.");
        }
        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

Chiudere l’oggetto DataReader

Chiamare sempre il metodo Close() una volta terminato l'uso dell'oggetto DataReader.

Nota

I parametri di output o i valori restituiti presenti nell'oggetto Command non sono disponibili fino a quando l'oggetto DataReader non viene chiuso.

Importante

Mentre un oggetto DataReader è aperto, l'oggetto Connection viene usato esclusivamente da tale oggetto DataReader. Non sarà possibile eseguire alcun comando per l'oggetto Connection né creare un altro oggetto DataReader fino a quando l'oggetto DataReader originale non viene chiuso.

Nota

Non chiamare Close o Dispose su un oggetto Connection, un oggetto DataReader o su qualsiasi altro oggetto gestito nel metodo Finalize della classe. Nei finalizzatori rilasciare solo le risorse non gestite che la classe controlla direttamente. Se nella classe non sono presenti risorse non gestite, non includere un metodo Finalize nella definizione della classe. Per altre informazioni, vedere Garbage Collection.

Recuperare più set di risultati usando NextResult

Se l'oggetto DataReader restituisce più set di risultati, chiamare il metodo NextResult per scorrere in modo sequenziale i set di risultati. Nell'esempio seguente viene illustrata l'elaborazione dei risultati di due dichiarazioni SELECT da parte del tipo SqlDataReader usando il metodo ExecuteReader.

static void RetrieveMultipleResults(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM dbo.Categories;" +
          "SELECT EmployeeID, LastName FROM dbo.Employees",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Check if the DataReader has any row.
        while (reader.HasRows)
        {
            Console.WriteLine("\t{0}\t{1}", reader.GetName(0),
                reader.GetName(1));

            // Obtain a row from the query result.
            while (reader.Read())
            {
                Console.WriteLine("\t{0}\t{1}", reader.GetInt32(0),
                    reader.GetString(1));
            }

            // Hop to the next result-set.
            reader.NextResult();
        }
        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

Ottenere informazioni sullo schema dall'oggetto DataReader

Mentre un oggetto DataReader è aperto, è possibile recuperare le informazioni sullo schema relative al set di risultati corrente usando il metodo GetSchemaTable. GetSchemaTable restituisce un oggetto DataTable popolato con righe e colonne contenenti le informazioni sullo schema del set di risultati corrente. L'oggetto DataTable contiene una riga per ogni colonna del set di risultati. Ogni colonna della tabella dello schema è associata a una proprietà delle colonne restituite nelle righe del set di risultati, in cui ColumnName è il nome della proprietà e il valore della colonna è il valore della proprietà. L'esempio seguente rilascia le informazioni sullo schema per DataReader.

static void GetSchemaInfo(SqlConnection connection)
{
    using (connection)
    {
        SqlCommand command = new SqlCommand(
          "SELECT CategoryID, CategoryName FROM Categories;",
          connection);
        connection.Open();

        SqlDataReader reader = command.ExecuteReader();

        // Retrieve schema information about the current result-set.
        DataTable schemaTable = reader.GetSchemaTable();

        foreach (DataRow row in schemaTable.Rows)
        {
            foreach (DataColumn column in schemaTable.Columns)
            {
                Console.WriteLine(String.Format("{0} = {1}",
                   column.ColumnName, row[column]));
            }
        }

        // Always call the Close method when you have finished using the DataReader object.
        reader.Close();
    }
}

Vedi anche