2009-12-26 8 views
7

Ho dato un'occhiata al sito e su Google, ma non riesco a trovare una buona soluzione per quello che sto cercando di fare.C# SQLServer che recupera i risultati e inserisce in un formato .csv

Fondamentalmente, ho un'applicazione client del server (C#) dove invio al server un'istruzione di selezione SQL (Connessione a SQL Server 2008) e vorrei restituire i risultati in modo CSV al client.

Finora ho il seguente:

if (sqlDataReader.HasRows) 
{ 
    while(sqlDataReader.Read()) 
    { 
     //not really sure what to put here and if the while should be there! 
    } 

} `

Purtroppo, sono davvero una novità per il collegamento di C# con SQL. Ho bisogno di qualche consiglio su come mettere semplicemente i risultati in una stringa in un formato csv. Le colonne e i campi sono probabilmente diversi, quindi non posso usare il metodo di qualcosa [qualcosa] come ho visto in alcuni siti. Non sono sicuro di essere comprensibile per te!

Apprezzerei molto ogni suggerimento/punto su come procedere per favore!

+0

se PowerShell è un'opzione per voi ha entrambi i moduli di SQL Server e un writer CSV incorporato. Alcuni POSH genuini possono probabilmente dirti come farlo con una dichiarazione. –

risposta

13

Ecco un metodo che uso per scaricare qualsiasi IDataReader fuori ad uno StreamWriter. Generalmente creo StreamSwriter in questo modo: new StreamWriter(Response.OutputStream). Converto qualsiasi carattere a virgolette nell'input in caratteri a virgoletta singola (forse non è il modo migliore per gestirlo, ma funziona per me).

public static void createCsvFile(IDataReader reader, StreamWriter writer) { 
    string Delimiter = "\""; 
    string Separator = ","; 

    // write header row 
    for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) { 
     if (columnCounter > 0) { 
      writer.Write(Separator); 
     } 
     writer.Write(Delimiter + reader.GetName(columnCounter) + Delimiter); 
    } 
    writer.WriteLine(string.Empty); 

    // data loop 
    while (reader.Read()) { 
     // column loop 
     for (int columnCounter = 0; columnCounter < reader.FieldCount; columnCounter++) { 
      if (columnCounter > 0) { 
       writer.Write(Separator); 
      } 
      writer.Write(Delimiter + reader.GetValue(columnCounter).ToString().Replace('"', '\'') + Delimiter); 
     } // end of column loop 
     writer.WriteLine(string.Empty); 
    } // data loop 

    writer.Flush(); 
} 
+0

Grazie! Ho adattato questo alla mia soluzione e funziona come un fascino! grazie mille – Erika

1

Potrebbe essere possibile adattare l'implementazione di uno scrittore CSV available here.

Se è anche necessario analizzare i file CSV, lo implementation here è relativamente buono.

Il formato CSV è più complicato di quanto sembri, in particolare se si tratta di dati arbitrari provenienti da una query. Dovresti essere in grado di gestire l'escape di caratteri speciali (come virgolette e virgole), occupandoti di interruzioni di linea e simili. È meglio trovare e utilizzare un'implementazione comprovata, specialmente se sei nuovo in C#.

+0

Il collegamento è interrotto. Gentilmente suggerire uno nuovo se presente. –

1

È possibile ottenere i nomi di colonna della tabella come questa:

SqlConnection conn = new SqlConnection(connString); 
conn.Open(); 

SqlCommand cmd = new SqlCommand(sql, conn); 
SqlDataReader rdr = cmd.ExecuteReader(); 

DataTable schema = rdr.GetSchemaTable(); 
foreach (DataRow row in schema.Rows) 
{ 
    foreach (DataColumn col in schema.Columns) 
     Console.WriteLine(col.ColumnName + " = " + row[col]); 
} 

rdr.Close() 
conn.Close(); 

Naturalmente è possibile determinare i nomi delle colonne con la prima fila unica, qui lo fa in ogni righe.

Ora è possibile inserire il proprio codice per unire le colonne in una linea di CSV abbastanza facilmente ...

Grazie

1

Come accennato, ci sono alcuni problemi con delimitatori, caratteri di escape correttamente e formattazione di tipi diversi correttamente. Ma se stai solo cercando un esempio di mettere i dati in una stringa, eccone un altro. Non fa alcun controllo per le complicazioni di cui sopra.

public static void ReaderToString(IDataReader Reader) 
    { 
    while (Reader.Read()) 
     { 
     StringBuilder str = new StringBuilder(); 
     for (int i = 0; i < Reader.FieldCount; i++) 
      { 

      if (Reader.IsDBNull(i)) 
       str.Append("null"); 
      else 
       str.Append(Reader.GetValue(i).ToString()); 

      if (i < Reader.FieldCount - 1) 
       str.Append(", "); 

      } 
     // do something with the string here 
     Console.WriteLine(str); 
     } 
    } 
1

Quando si tratta di file CSV di solito vado per la libreria FileHelpers: ha una classe SqlServerStorage che è possibile utilizzare per leggere i record da un server SQL e scriverli in un file CSV.