2016-11-28 63 views
1

我创建了一个存储过程(SP)的列表,并集成在以下方式工作得很好:DataTable中要加载

编辑:

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,它抛出也不例外,但是报告中没有数据如下:

输出:

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; 
} 

注和更新:我能列表转换为IDataReader的加载,或还有什么能让它做什么简单的办法?我见过一些教程,作者使用foreach循环迭代列表,然后将其绑定到DataTable。但我只是试图简单地将列表加载到DataTable。

+0

这对您有帮助吗? http://stackoverflow.com/questions/23697467/returning-datatable-using-entity-framework – user3185569

+0

如果你真的需要使用数据阅读器,然后自己实现一个。但是,如果你只需要将你的数据绑定到报表上,然后尝试使用BindingSource组件(我假设他们在这里使用win表单)。 BindingSource可以与列表绑定。然后,您可以将您的报告绑定到BindingSouce – user1681317

+0

该解决方案几乎与mine @ user3185569完全相同。谢谢。我一定会在帖子中看到其他选择。 @ user1681317没关系。我没有得到它我的意思是我自己创建'DataReader'。我已经在项目中使用了EF(Web Form),并将传统的Sql和Linq混合在一起,开始使用DataTable。所以我在考虑是否会有任何冲突或其他选择来充分使用EF。 –

回答

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; 
} 
+0

只需将该列表作为方法或函数的参数传递即可。 –