Utilizzare i cursori per leggere e scrivere su un database SQL Server Compact 4

di Cristian Civera, in .NET Framework,

Le API messe a disposizione per utilizzare e manipolare un database SQL Server Compact sono state sviluppate per adeguarsi alla struttura ADO.NET delle classi, perciò, così come per gli altri provider, si trovano le classi SqlCeConnection, SqlCeCommand e SqlCeDataReader.

Per l'esecuzione delle query e per la relativa lettura, il metodo ExecuteReader è il più veloce e come per tutti i database permette la lettura forward only dei dati. In SQL Server Compact oltre a questa tecnica però, è possibile utilizzare il metodo ExecuteResultSet che restituisce il result set di una query, permettendone facoltativamente anche lo spostamento libero all'interno del result set e la modifica dei dati, il tutto in modo concorrente.

Se questa pratica su database relazionali normalmente era una volta possibile, ma poi deprecata, per via delle scarse prestazioni e ripercussioni sull'engine del database, in SQL Server Compact questa tecnica gode di buone prestazioni poiché vive all'interno dello stesso processo.

Per dimostrarne l'uso, nell'esempio seguente si esegue una query e si sfoglia il result set, si eliminano i record consultati con il metodo Delete e si aggiunge una nuova riga con il metodo Insert.

using (SqlCeConnection connection = new SqlCeConnection("Data Source=test.sdf"))
{
  connection.Open();

  using (SqlCeCommand command = connection.CreateCommand())
  {
    // Preparo il comando
    command.CommandText = "SELECT ID, Name FROM Test";

    // Sensibile ai cambiamenti
    // Avanti e indietro sul record
    // Record aggiornabile
    var options = ResultSetOptions.Sensitive
      | ResultSetOptions.Scrollable
      | ResultSetOptions.Updatable;
          
    using (SqlCeResultSet result = command.ExecuteResultSet(options))
    {
      // Sfoglio la tabella
      foreach (SqlCeUpdatableRecord record in result)
      {
        // Leggo il valore
        string name = record.GetString(1);
        // Cancello il record corrente
        result.Delete();
      }

      // Creo una nuova riga
      SqlCeUpdatableRecord newRecord = result.CreateRecord();
      newRecord.SetString(1, "test");
      result.Insert(newRecord);
    }
  }
}

Le opzioni, indicabili con l'enumeratore ResultSetOptions, permettono di ottimizzare l'accesso richiedendo certe caratteristiche solo se strettamente necessarie. Il tipo SqlCeResultSet infine permette di essere sfogliato come un normale IEnumerable.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi