DataTable加载列表

时间:2016-11-28 06:20:23

标签: c# linq stored-procedures datatable

我已经创建了一个存储过程(SP)并以下面的方式集成,它可以正常工作:

编辑:

private DataTable GetSPResult()
{
    int m = Convert.ToInt32(DropDownList1.SelectedValue);
    int k = Convert.ToInt32(DropDownList2.SelectedValue);

    DataTable ResultsTable = new DataTable();

    var context = new DemoEntities();
    var con = context.Database.Connection;
    var connectionState = con.State;

    try
    {
        using (context)
        {
            con.Open();

            using (var cmd = con.CreateCommand())
            {
                cmd.CommandText = "MonthlyConsumption"; //Here is the SP
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add(new SqlParameter("@Para1", SqlDbType.Int));
                cmd.Parameters["@Para1"].Value = m;
                cmd.Parameters.Add(new SqlParameter("@Para2", SqlDbType.Int));
                cmd.Parameters["@Para2"].Value = k;

                using (var reader = cmd.ExecuteReader())
                {
                    ResultsTable.Load(reader);
                }
            }
        }
    }

    catch (Exception ex)
    {
        throw ex;
    }

    finally
    {
        if (con != null)
        {
            con.Close();
        }
    }

    return ResultsTable;
}

最后完成以下操作:点击按钮,我可以在报告中看到数据

protected void Button1_Click(object sender, EventArgs e)
{
    DataTable dt = GetSPResult();
    ReportViewer1.Visible = true;

    ReportViewer1.LocalReport.ReportPath = Server.MapPath("Report1.rdlc");
    ReportViewer1.LocalReport.DataSources.Clear();
    ReportViewer1.LocalReport.DataSources.Add(new ReportDataSource("DataSet1", dt));    
}

输出:

SP_02

但是当我尝试使用ORM将列表转换为DataTable时,它不会抛出任何异常,但报告中没有数据,如下所示:

输出:

SP_01

这是我迄今为止使用ORM实现的代码 - 实体框架也可以工作:顺便说一句,我将断点用于调试目的,它获取值但不返回报告中的数据

public DataTable GetSPResult()
{
    int m = Convert.ToInt32(DropDownList1.SelectedValue);
    int k = Convert.ToInt32(DropDownList2.SelectedValue);

    DataTable ResultsTable = new DataTable();

    var context = new DemoEntities();

    using (context)
    {
       var query = context.MonthlyConsumption(m, k).ToList();

       foreach (var item in query)
       {
            ResultsTable.Columns.Add("Store");
            ResultsTable.Columns.Add("Product");
            ResultsTable.Columns.Add("Jan");
            ResultsTable.Columns.Add("Feb");
            ResultsTable.Columns.Add("Mar");
            ResultsTable.Columns.Add("Apr");
            ResultsTable.Columns.Add("May");
            ResultsTable.Columns.Add("Jun");
            ResultsTable.Columns.Add("Jul");
            ResultsTable.Columns.Add("Aug");
            ResultsTable.Columns.Add("Sep");
            ResultsTable.Columns.Add("Oct");
            ResultsTable.Columns.Add("Nov");
            ResultsTable.Columns.Add("Dec");

            ResultsTable.Rows.Add(item.StoreName);
            ResultsTable.Rows.Add(item.ItemName);
            ResultsTable.Rows.Add(item.M1.Value);
            ResultsTable.Rows.Add(item.M2.Value);
            ResultsTable.Rows.Add(item.M3.Value);
            ResultsTable.Rows.Add(item.M4.Value);
            ResultsTable.Rows.Add(item.M5.Value);
            ResultsTable.Rows.Add(item.M6.Value);
            ResultsTable.Rows.Add(item.M7.Value);
            ResultsTable.Rows.Add(item.M8.Value);
            ResultsTable.Rows.Add(item.M9.Value);
            ResultsTable.Rows.Add(item.M10.Value);
            ResultsTable.Rows.Add(item.M11.Value);
            ResultsTable.Rows.Add(item.M12.Value);
        }
     }

   return ResultsTable;
}

注意并更新:我可以将List转换为IDataReader来加载它,还是有任何简单的方法来完成它?我已经看过一些教程,其中作者使用foreach循环来迭代列表,然后将其绑定到DataTable。但我只想简单地将列表加载到DataTable。

1 个答案:

答案 0 :(得分:1)

终于完成了。刚刚使用以下方法将列表转换为DataTable:

public DataTable ToDataTable<T>(List<T> items)
{
   DataTable ResultsTable = new DataTable(typeof(T).Name);

   //Gets all the properties
   PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance);

   foreach (PropertyInfo prop in Props)
   {
      //Sets column names as Property names
      ResultsTable.Columns.Add(prop.Name);
   }

   foreach (T item in items)
   {
      var values = new object[Props.Length];

      for (int i = 0; i < Props.Length; i++)
      {
         //Inserts property values to datatable rows
         values[i] = Props[i].GetValue(item, null);
      }

      ResultsTable.Rows.Add(values);
   }

   return ResultsTable;
}