【问题标题】:Loading data in to a DataTable from a SQL Server database and displaying Charts in MVC3从 SQL Server 数据库将数据加载到 DataTable 并在 MVC3 中显示图表
【发布时间】:2012-12-22 16:00:48
【问题描述】:

我对 MVC 和一般编程非常陌生,我在将数据从 SQL Server 数据库加载到我的 MVC3 应用程序时遇到了麻烦。我无法让它与模型一起使用,所以我只有一个控制器和一个视图。代码如下所示:

控制器:

public ActionResult Datatable()
{
    string conn = System.Configuration.ConfigurationManager.ConnectionStrings["SampleDBConn"].ToString();
    SqlConnection connect = new SqlConnection(conn);
    connect.Open();

    SqlCommand RID = new SqlCommand("SELECT Request_ID FROM SampleDB.dbo.Transactions", connect);
    SqlCommand Tdate = new SqlCommand("SELECT Trans_Date FROM SampleDB.dbo.Transactions", connect);
    SqlCommand MID = new SqlCommand("SELECT Merchant_ID FROM SampleDB.dbo.Transactions", connect);
    SqlCommand Ttype = new SqlCommand("SELECT Trans_Type FROM SampleDB.dbo.Transactions", connect);
    SqlCommand Tamt = new SqlCommand("SELECT Total_Amt FROM SampleDB.dbo.Transactions", connect);

    DataTable dt = new DataTable("MyTable");
    dt.Columns.Add(new DataColumn("Request_ID", typeof(SqlCommand)));
    dt.Columns.Add(new DataColumn("Trans_Date", typeof(SqlCommand)));
    dt.Columns.Add(new DataColumn("Merchant_ID", typeof(SqlCommand)));
    dt.Columns.Add(new DataColumn("Trans_Type", typeof(SqlCommand)));
    dt.Columns.Add(new DataColumn("Total_Amt", typeof(SqlCommand)));

        DataRow row = dt.NewRow();
        row["Request_ID"] = RID;
        row["Trans_Date"] = Tdate;
        row["Merchant_ID"] = MID;
        row["Trans_Type"] = Ttype;
        row["Total_Amt"] = Tamt;
        dt.Rows.Add(row);

    connect.Close();
    return View(dt);
}

查看:

    @model System.Data.DataTable

    @{
        ViewBag.Title = "Datatable";
        Layout = "~/Views/Shared/_Layout.cshtml";
    }

   < h2 > Datatable < /h2 >

   < div id="header" >< /div >

   < br / >

   < style type"text/css" >

         #DT1{display:inline}

   < /style >

   < table border="1" id="DT1" style="background-color: Lime" >

        < thead style="background-color:Olive" >
            < tr >

             @foreach (System.Data.DataColumn col in Model.Columns)
             {
                    < th >@col.Caption< /th >
             }
            </tr>

        < /thead >

        < tbody >

           @foreach (System.Data.DataRow row in Model.Rows)
           {
                <tr>
                    @foreach (var cell in row.ItemArray)
                    {
                       <td>@cell.ToString()</td>
                    }
               </tr>
             }
       </tbody>
    </table>

生成的表格显示每一列,如下所示:

Request_Id      
System.Data.SqlClient.SqlCommand

“Request_Id”是列标题,“System.Data.SqlClient.SqlCommand”是数据所在的位置

我在另一个 stackoverflow 解决方案中使用了这个方法: Displaying standard DataTables in MVC

我的应用程序的最终目标是通过复选框或下拉列表动态查询我的数据库以显示图表,并且我还需要能够将数据导出到 Excel 文件。如果有人对我应该如何处理这个问题有任何想法或建议,将不胜感激。

我已经能够使用存储过程通过这种方法静态创建图表:

    @{
        ViewBag.Title = "Chart1"; 
     }

    < h2 >Chart1< /h2 >
    @{
          var db = Database.Open("SampleDBConn");
          var dbdata = db.Query("August2012byMerch");

          var myChart = new Chart(width: 1100, height: 600, theme: ChartTheme.Green)
          .AddTitle("Merchant Totals by Transaction Type: August 2012")
          .AddSeries("Default",
           xValue: dbdata, xField: "Transaction Type",
           yValues: dbdata, yFields: "Total")
           .Write();
           db.Close();
       }

谢谢!

【问题讨论】:

  • 在我看来,你应该尝试从0开始理解框架。
  • @Jorge 我得到了框架。构建一个处理数据的模型,然后使用控制器作为协调器将模型传递给视图。然后视图显示数据。我只是在为此构建模型时遇到了麻烦,所以我正在尝试一种动手方法来了解可以做什么和不可以做什么
  • 您的模型通常是一个简单的 POCO。我不会尝试使用 DataTable 作为模型,而是添加一个数据层(查看存储库和工作单元设计模式),它返回您将在模型中使用的 POCO。 EF 非常适合这一点。
  • @KevinJunghans 谢谢!我去看看

标签: sql asp.net-mvc-3 datatable ef-code-first poco


【解决方案1】:

就 DataTable 而言,我找到了适合我的解决方案。

根据凯文在 cmets 部分的建议,我使用了具有实体框架代码优先设计的 POCO 模型。 研究也让我在这里找到了一个很棒的教程 -> http://www.asp.net/mvc/tutorials/mvc-music-store/mvc-music-store-part-4

我的模型基于本教程,然后稍作修改以满足我的需要。

这是模型:

    namespace Example_1.Models
    {
        public class Transaction
        {
            [Key]
            public int TID { get; set; }
            public DateTime TDate { get; set; }   
            public decimal TAmt { get; set; }
            public string Trans_Type { get; set; }
            public int MID { get; set; }
        }
    }

    namespace Example_1.Models
    {
         public class Merchants
         {
            [Key]
            public int MID { get; set; }
            public string Merchant { get; set; }
            public List<Transaction> Transactions { get; set; }
         }
    }
    namespace Example_1.Models
    {
        public class SampleDBEntities : DbContext
        {
            public DbSet<Transaction> Transactions { get; set; }
            public DbSet<Merchants> Merchants { get; set; }
        }
    }

SampleDBEntities 类必须与 web.config 文件中的连接字符串匹配。而 Transactions 类和 Merchants 类必须与我的数据库中设置的变量相匹配。

这里是控制器:

     public ActionResult Browse(string Merchant)
    {
        var mercmodel = sampledb.Merchants.Include("Transactions")
            .SingleOrDefault(g => g.Merchant == Merchant);
        return View(mercmodel);
    }

Merchant 变量必须与 URL 中采用的路径相匹配。例如,我的网址是 "http://localhost:64269/Transaction/Browse?Merchant=ISCO_CA"

然后在视图中,我构建了一个表格,我将数据传递到:

    <script src="@Url.Content("~/Scripts/sorttable.js")" type="text/javascript">   </script>


   @model Example_1.Models.Merchants

    @{
        ViewBag.Title = "Browse";
    }


    <h2>Browse</h2>

      <h3>Transactions: @Model.Merchant</h3>
     <table class="sortable">
     <tr>
     <th>ID</th>
     <th>Date</th>
     <th>Merchant</th>
     <th>Amount</th>
     </tr>
        @foreach (var transaction in Model.Transactions)
         {
            <tr>
              <td>
                @transaction.TID
             </td>
             <td>
               @transaction.TDate
             </td>
             <td>
               @transaction.Trans_Type
             </td>
             <td>
               $@transaction.TAmt
            </td>
          </tr>
        }
     </table>

这显示了一个漂亮的表格,如下所示:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-14
    • 2013-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多