Redazione
a- a+

Importare ed esportare CSV con SQL

Vediamo come esportare ed importare dati da un database SQL Server. Codici ed esempi.

Un modo per esportare ed importare dati da un database SQL Server sono i file .CSV Letteralmente CSV vuol dire:  Comma Separated Variables. È un formato file utilizzato per lo scambio di dati fra fogli di calcolo o database. I singoli campi di dati sono separati da una virgola. Ciò rende i file facilmente trasferibili e convertibili da ogni software, ma se un campo di dati contiene già una virgola al suo interno, questa deve essere preceduta e seguita da doppie virgolette.

Utilizziamo il formato CSV per esportare ed importare  i dati da e per  un database SQL Server.  La stringa di connessione per SQL Server e per il file CSV viene  conservata nel file web.config. La stringa viene letta utilizzando il System.Collections.Specialized.  I file CSV  li conserviamo in una cartella che denomineremo tabelle. Vediamo nel dettaglio come è impostato il file web.config:

<appSettings>
  <add key="connsql" value="server=DATABASESERVER;database=Northwind;
                     Trusted_Connection=false;uid=sqluserid;pwd=sqlpassword"/>
  <add key="connxls" value="Provider= Microsoft.Jet.OLEDB.4.0;
                     Extended Properties='text;HDR=Yes;FMT=Delimited';Data Source=" />
</appSettings>

Dove

<add key="connsql" value="server=DATABASESERVER;database=nomeDB;
                     Trusted_Connection=false;uid=sqluserid;pwd=sqlpassword"/>

contiene la stringa di connessione per il database SQL Server.

Passiamo al codice ASP.NET che effettuerà l’export dei dati tramite la creazione automatica di un file CSV. Procediamo in modo ordinato: ogni tabella del nostro database sarà esportata in un file CSV che avrà il nome della tabella stessa. Supponiamo per esempio che nel database su SQL Server sia presente la tabella test che intendiamo esportare all’evento click di un tasto presente sulla nostra pagina ASP.NET. Nell’evento click del tasto scriviamo il seguente codice:

protected void btnTest_Click(object sender, EventArgs e) 
{ 

// apro la connessione al database sql server leggendo la stringa di connessione memorizzata nel file 
//   web.config  
  string con = ConfigurationManager.ConnectionStrings["connsql"].ConnectionString.ToString(); 
    SqlConnection conn = new SqlConnection(con); 
// leggo il contenuto della tabella test utilizzando l’oggetto SqlDataAdapter
    SqlDataAdapter da = new SqlDataAdapter("select * from test", conn); 
// creo un DataSet
    DataSet ds = new DataSet(); 
// riempio Il DataSet con i valori della tabella test
     da.Fill(ds, "test"); 
// riempio un gridView con I dati della tabella test
GridView1.DataSource = ds.Tables["test"].DefaultView; 
GridView1.DataBind(); 
DataTable dt = ds.Tables["test"]; 
// esporto I valori della tabella test nel file test.csv e lo salvo nella cartella tabelle
DatasetToCSV(dt, Server.MapPath("tabelle") + "\test.csv"); 
} 

// funzione per l’esportazione da tabella a file csv
public void DatasetToCSV(DataTable dt, string strFilePath) 
{ 
     #region Export SqlServer Table Data to CSV file in application folder 
     // creo il file csv  
     StreamWriter SW = new StreamWriter(strFilePath, false); 
// creo l’intestazione delle colonne
     int ColCount = dt.Columns.Count; 
     for (int i = 0; i < ColCount; i++) 
     { 
        SW.Write(dt.Columns[i]); 
        if (i < ColCount - 1) 
        { 
                   SW.Write(",");  // separo i valori con le virgole
        } 
      } 
      SW.Write(SW.NewLine); 
      // inserisco i valori  
       foreach (DataRow dr in dt.Rows) 
         { 
          for (int i = 0; i < ColCount; i++) 
           { 
             if (!Convert.IsDBNull(dr[i])) 
               { 
                  SW.Write(dr[i].ToString()); 
                } 
             if (i < ColCount - 1) 
                { 
                  SW.Write(",");  // separo i valori con le virgole
                 } 
              } 
                SW.Write(SW.NewLine); 
          } 
         SW.Close(); 
         #endregion 
       }

Il lavoro di esportazione dati avviene tramite la funzione DatasetToCSV che consente di salvare i dati inseriti della tabella passata come parametro di input alla funzione in un file CSV.

La funzione DatasetToCSV ha due parametri di input: il contenuto della tabella passato come DataTable e il path completo di nome file dove creare e salvare il file .csv:

public void DatasetToCSV(DataTable dt, string strFilePath) 

Inizialmente carichiamo nel file CSV i nomi delle colonne della tabella:

int ColCount = dt.Columns.Count; 
     for (int i = 0; i < ColCount; i++) 
     { 
        SW.Write(dt.Columns[i]); 
        if (i < ColCount - 1) 
        { 
                   SW.Write(",");  // separo i valori con le virgole
        } 
      } 
      SW.Write(SW.NewLine); 

Ogni nome di colonna è separato da virgola e l’ultimo nome è identificato dal carattere “newLine” che indica la fine dei nomi delle colonne. Successivamente si passa a inserire nel file CSV i valori delle colonne, anche questi separati da virgole, e l’ultimo valore dell’ultima colonna è caratterizzato non da una virgola ma dal carattere “newLine” come sopra.

// inserisco i valori  
       foreach (DataRow dr in dt.Rows) 
         { 
          for (int i = 0; i < ColCount; i++) 
           { 
             if (!Convert.IsDBNull(dr[i])) 
               { 
                  SW.Write(dr[i].ToString()); 
                } 
             if (i < ColCount - 1) 
                { 
                  SW.Write(",");  // separo i valori con le virgole
                 } 
              } 
                SW.Write(SW.NewLine); 
          } 
         SW.Close(); 

Non ci resta che realizzare la funzione inversa, ovvero leggere i dati contenuti in un file CSV e creare la tabella con nomi delle colonne e valori in un database SQL Server. Ossia creare la funzione di import dei dati.

ImportCSVToDataset(string strFilePath, string nomeTabella){
string line = null;
int i = 0;
DataTable dt = new DataTable
// leggo il contenuto del file csv passato come parameter di input
using (StreamReader sr = File.OpenText(@strFilePath)){ 
              while ((line = sr.ReadLine()) != null)  
                            {   
                                   string[] data = line.Split(',');    
                                   if (data.Length > 0)   
                                      {    
                                          if (i == 0)     
                                            {     
                              // nel datatable prima creo I nomi delle colonne che sono I primi valori del file csv  
                                                    foreach (object item in data) 
                                                       {         
                                                          dt.Columns.Add(new DataColumn());       
                                                       }       
                                                     i++;      
                                              }   
// I successive valori del file csv sono I valori delle colonne che costituiranno I singoli record
   
                                            DataRow row = dt.NewRow();     
                                           row.ItemArray = data;      
                                           dt.Rows.Add(row);    
                                        }   
                                   }   
// apro la connessione al database leggendo la strina di connessione salvata nel file web.config
           SqlConnection con = new SqlConnection(ConfigurationManager.AppSettings["connmsa "]);   
          con.Open();   
          SqlBulkCopy s = new SqlBulkCopy(con);   

//creo la tabella destinazione il cui nome è passato come parametro di input  e passo l’intero datatable 
// in modo da creare le colonne ed importare i valori dei record.

          s.DestinationTableName = nomeTabella;   
          s.WriteToServer(dt);  
         s.Close();   
         con.Close();
}

La prima parte della nostra funzione legge i valori dal file CSV il cui nome è un parametro di input. I primi valori sono i nomi delle colonne della tabella, ogni nome di colonna è separato dal successivo da una virgola, mentre l’ultimo nome di colonna è seguito dal simbolo di “newLine”. Successivamente seguono i valori delle colonne medesime. Nomi colonne e dati vengono memorizzati in un oggetto DataTable. In questo modo avremo  messo in memoria sul server la struttura dell’intera tabella comprensiva di dati.

DataTable dt = new DataTable
// leggo il contenuto del file csv passato come parameter di input
using (StreamReader sr = File.OpenText(@strFilePath)){ 
              while ((line = sr.ReadLine()) != null)  
                            {   
                                   string[] data = line.Split(',');    
                                   if (data.Length > 0)   
                                      {    
                                          if (i == 0)     
                                            {     
                              // nel datatable prima creo I nomi delle colonne che sono I primi valori del file csv  
                                                    foreach (object item in data) 
                                                       {         
                                                          dt.Columns.Add(new DataColumn());       
                                                       }       
                                                     i++;      
                                              }   
// I successive valori del file csv sono I valori delle colonne che costituiranno I singoli record
   
                                            DataRow row = dt.NewRow();     
                                           row.ItemArray = data;      
                                           dt.Rows.Add(row);    
                                        }   
                                   }   

A questo punto non ci resta altro che salvare su SQL Server ciò che è in memoria e il gioco e fatto. L’ultima parte della nostra funzione fa proprio questo.



Ti potrebbe interessare anche

commenta la notizia

C'è 1 commento
Francesco
Hai dubbi su questo articolo?