Передать таблицу из DataSet в качестве параметра - PullRequest
0 голосов
/ 19 сентября 2018

Я действительно новичок в C # и ASP.Net, могу сказать, что я учусь через дорогу .Что мне нужно сделать, это запустить хранимую процедуру и создать файл Excel с ответом.Это мой код контроллера:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using ConfigurationSettings = System.Configuration.ConfigurationManager;
using System.IO;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace NewSalesReport.Controllers
{    
public class NewSalesReportController : Controller
{

    class Program
    {
        static void Main()
        {
            string inline = ConfigurationSettings.AppSettings["ConectionString"];
            using (SqlConnection toConect = new SqlConnection(inline))
            {
                using (SqlCommand cmd = new SqlCommand("DaReport", toConect))
                {
                    cmd.CommandType = CommandType.StoredProcedure;

                    cmd.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime));
                    cmd.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.DateTime));

                    using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
                    {
                        DataSet ds = new DataSet();
                        adp.Fill(ds);
                        /*if (ds != null)
                        {
                            //Console.Write("It is not Empty");
                        } */


                    }

                }


            }

        }

        private void SetDataExcel(object result)
        {
            GridView grid = new GridView();
            grid.DataSource = result;
            StringWriter strwritter = new StringWriter();
            HtmlTextWriter htmltextwrtter = new HtmlTextWriter(strwritter);

            grid.RenderControl(htmltextwrtter);

            Response.ClearContent();
            Response.Buffer = true;
            Response.AddHeader("content-disposition", "attachment; filename=reportExcel.xls");
            Response.ContentType = "application/ms-excel";

            Response.Output.Write(strwritter.ToString());
            Response.Flush();
            Response.End();
            strwritter.Dispose();
            htmltextwrtter.Dispose();
        }

        public ActionResult GetAprovedForPay(DateTime? fi = null, DateTime? ff = null)
        {
            var result = _repo.GetAprovedForPay(fi, ff);
            SetDataExcel(result);
            return null;
        }

    }


}

}

Кто-то помогает мне с несколькими советами, и он сказал мне, что мне нужно передать первую таблицу в качестве параметра: ds.Tables[0], но он не объяснил, как.

Также, когда я запускаю, компилятор показывает ошибку, которая говорит, что мне нужен

ссылочный объект для поля, метода или свойства Controller.Response.

Кто-то может мне помочь, пожалуйста, с этими двумя вопросами?Как я уже сказал, я новичок в этой дыре .Net.

Заранее спасибо

1 Ответ

0 голосов
/ 19 сентября 2018

Ссылка на объект требуется для нестатического поля, метода или свойства. Произошла ошибка, поскольку вы вызываете Controller.Response из метода, который имеет тип возврата void вместо ActionResult,

Сначала удалите внутренний класс Program и переименуйте метод Main() в другое имя (также при необходимости удалите static).Похоже, код включает в себя метод Main(), ранее использовавшийся в консоли / приложении WinForms, и вы должны изменить его, чтобы избежать путаницы.

Во-вторых, удалите использование Response и используйте FileResult, чтобы вернуть файл для загрузки какв следующем примере:

public FileResult SetDataExcel(object obj)
{
    GridView grid = new GridView();
    grid.AutoGeneratedColumns = true; // automatically generate all columns from data source
    grid.DataSource = result;
    StringWriter strwritter = new StringWriter();
    HtmlTextWriter htmltextwrtter = new HtmlTextWriter(strwritter);

    grid.RenderControl(htmltextwrtter);

    string path = Server.MapPath("~/path/to/filename.xls");

    using (var sw = new StreamWriter(path))
    {
        sw.Write(strwriter.ToString());
    }

    var savedFile = new FileStream(path, FileMode.Open);

    return File(savedFile, "application/ms-excel");
}

Наконец, вы можете использовать перенаправление для вызова SetDataExcel, который возвращает файл:

public ActionResult GetAprovedForPay(DateTime? fi = null, DateTime? ff = null)
{
    var result = _repo.GetAprovedForPay(fi, ff);
    return RedirectToAction("SetDataExcel", new { obj = result });   
}

Примечание: Относительно привязки данных дляGridView, если для AutoGeneratedColumns установлено значение true, то вы можете использовать ds.Tables[0] в качестве источника данных (см. Ссылку здесь ):

string inline = ConfigurationSettings.AppSettings["ConectionString"];
using (SqlConnection toConect = new SqlConnection(inline))
{
    using (SqlCommand cmd = new SqlCommand("DaReport", toConect))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        cmd.Parameters.Add(new SqlParameter("@StartDate", SqlDbType.DateTime));
        cmd.Parameters.Add(new SqlParameter("@EndDate", SqlDbType.DateTime));

        using (SqlDataAdapter adp = new SqlDataAdapter(cmd))
        {
            DataSet ds = new DataSet();
            adp.Fill(ds);

            grid.DataSource = ds.Tables[0];
            grid.DataBind();
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...