2015-01-31 11 views
5

In questo momento il mio codice esporta tutte le colonne in cui inoltra la query in un file excel. I comandi SQL che vengono eseguiti sono in stored procedure. Voglio avere l'opzione per essere in grado di specificare quali colonne dai dati SQL che voglio esportare.C# - Necessità di idee sull'esecuzione di SQL ed esportazione in excel

Un metodo che sto pensando sarebbe quello di consentire all'utente di selezionare ciò che desidera e concatenarli in una query SQL anziché utilizzare i comandi nella stored procedure.

Ho anche provato a mettere i parametri nelle stored procedure all'interno dell'area selezionata pensando che sarebbe stato semplice avere parametri nel campo select ma da quello che ho capito finora è che non è consentito a causa della possibilità di SQL iniettabili.

Ho visto alcuni esempi di persone che usano DataSet e DataTables per conservare i dati SQL ma poi esportarli tutti per eccellere. Ma se la usi in questo modo, non dovresti avere bisogno di una serie di istruzioni condizionali da verificare prima di scrivere quella colonna?

Esistono altri metodi? Codice pubblicato qui sotto solo per mostrare quello che sto facendo finora.

private SqlDataSource GetDataSource(string FruitType) 
{ 

    SqlDataSource tempDataSource = new SqlDataSource(); 
    tempDataSource.ConnectionString = ConfigurationManager.ConnectionStrings["ServerConnectionString"].ToString(); 
    tempDataSource.SelectCommandType = SqlDataSourceCommandType.StoredProcedure; 
    switch (ReportType) 
    { 
     case "Oranges": 
      tempDataSource.SelectCommand = "getOrange";           
      break; 
     case "Apples": 
      tempDataSource.SelectCommand = "getApples";     
      break; 
     case "Pineapples": 
      tempDataSource.SelectCommand = "getPineapples"; 
      break; 
     case "Watermelons":     
      tempDataSource.SelectCommand = "getWatermelons";     
      break; 
     case "GrapeFruit":     
      tempDataSource.SelectCommand = "getGrapeFruit";     
      break; 
    } 

    tempDataSource.DataBind(); 
    return tempDataSource; 
} 
protected void btnSaveData(object sender, EventArgs e) 
{ 
    string attachment = "attachment; filename="; 
    attachment += "Fruit Data"; 
    attachment += ".xls"; 

    Response.ClearContent(); 
    Response.Charset = ""; 
    Response.AddHeader("content-disposition", attachment); 
    Response.ContentType = "application/ms-excel"; 

    StringWriter sw = new StringWriter(); 
    HtmlTextWriter htw = new HtmlTextWriter(sw); 

    GridView gvTemp = new GridView(); 
    gvTemp.Attributes["runat"] = "server"; 

    SqlDataSource ds = GetDataSource(FruitType); 
    gvTemp.DataSource = ds; 
    gvTemp.DataBind(); 
    gvTemp.RenderControl(htw); 
    Page.Controls.Add(gvTemp); 
    Response.Write(sw.ToString()); 
    Response.End(); 

} 

risposta

0

Si può facilmente utilizzare le tabelle temporanee per specificare le colonne che si desidera ottenere da stored procedure:

CREATE PROCEDURE sp_GetDiffDataExample 
     @columnsStatement NVARCHAR(MAX) -- Needed columns 
AS 
BEGIN 
    DECLARE @query NVARCHAR(MAX) 
    SET @query = N'SELECT ' + @columnsStatement + N' INTO ##TempTable FROM dbo.TestTable' 
    EXEC sp_executeSql @query 
    SELECT * FROM ##TempTable 
    DROP TABLE ##TempTable 
END 

Spero che questo aiuti.

+0

Poche domande ma quando inserisco le mie variabili nel parametro colonne devono già essere nel formato sql? Ad esempio 'col name1, col name2' Inoltre, perché devi inserirlo in un'altra tabella dopo aver selezionato le colonne dalla tabella solo per selezionare tutto dalla tabella di test? Non è ridondante? – user2677821

+0

Sì, il parametro colonne deve essere nel formato sql. Questo è solo un esempio, quindi puoi scrivere i tuoi parametri e selezionare i dati nello stesso modo. Per quanto ne so c'è solo un'opzione per ottenere colonne diverse risultato dalla procedura senza codifica manuale. Se si desidera consentire all'utente di selezionare le colonne desiderabili, si suppone che sia l'esempio più semplice. – dyatchenko

Problemi correlati