2015-01-31 3 views
5

Прямо сейчас мой код экспортирует все столбцы, которые он выполняет для запроса в файл excel. Выполняемые SQL-команды находятся в хранимых процедурах. Я хочу иметь возможность указать, какие столбцы из SQL-данных я хочу экспортировать.C# - Нужны идеи по выполнению SQL и экспорт в excel

Один из методов, о котором я думаю, заключается в том, чтобы пользователь мог выбрать то, что они хотят, и объединить их в SQL-запрос, а не использовать команды в хранимой процедуре.

Я также попытался поместить параметры в хранимые процедуры внутри области выбора, считая, что было бы просто иметь параметры в поле выбора, но из того, что я понимаю до сих пор, является то, что он не допускается из-за возможности SQL инъекции.

Я видел несколько примеров использования DataSet и DataTables для хранения данных SQL, но затем экспортировал все это в excel. Но если вы используете его таким образом, вам не понадобится куча условных операторов для проверки перед тем, как вывести этот столбец?

Есть ли другие методы? Код, указанный ниже, просто для того, чтобы показать, что я делаю до сих пор.

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(); 

} 

ответ

0

Вы можете легко использовать временные таблицы, чтобы указать, какие столбцы вы хотите получить от хранимой процедуры:

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 

Надеется, что это помогает.

+0

Несколько вопросов, но когда я помещаю свои переменные в параметр столбцов, они должны быть в формате sql уже? Например, «col name1, col name2» Кроме того, почему вы должны вставить его в другую таблицу после выбора столбцов из таблицы, чтобы выбрать все из тестовой таблицы? Разве это не избыток? – user2677821

+0

Да, параметр столбцов должен быть в формате sql. Это просто пример, поэтому вы можете написать свои собственные параметры и выбрать данные таким же образом. Насколько мне известно, существует только один вариант получения разных столбцов из процедуры без ручного кодирования. Если вы хотите, чтобы ваш пользователь выбирал желаемые колоды, предположим, что это самый простой пример. – dyatchenko

Смежные вопросы