如何从对 Oracle 完成的选择查询中获取数据表,并将其显示在 MVC 中的视图中

本文关键字:显示 视图 MVC 数据表 Oracle 查询 选择 获取 | 更新日期: 2023-09-27 17:57:23

我希望能够在我的oracle数据库中返回一个表,并将其发送到我的MVC结构中显示在我的视图中。对于我的模型,我的代码看起来像这样:

        public DataTable Show(int Poll_ID)
    {
        OleDbDataReader myOleDBDataReader = DBConn("SELECT * FROM MCQ_QUESTIONS WHERE Poll_ID = 1");
        DataSet dataSet = new DataSet();
        DataTable schemaTable = myOleDBDataReader.GetSchemaTable();
        DataTable dataTable = new DataTable();
        for (int cntr = 0; cntr < schemaTable.Rows.Count; ++cntr)
        {
            DataRow dataRow = schemaTable.Rows[cntr];
            string columnName = dataRow["ColumnName"].ToString();
            DataColumn column = new DataColumn(columnName, dataRow.GetType());
            dataTable.Columns.Add(column);
        }
        myOleDBDataReader.Close();
        myOleDbConnection.Close();
        return dataTable;

但它不起作用。任何帮助都是值得赞赏的,伙计们!!我的控制器类中的代码如下所示:

public ActionResult Details(int id)
    {
        PollModel poll = new PollModel();
        DataTable dt = new DataTable();
        dt = poll.Show(1);
        //ViewData["Poll"] = poll.Show();
        ViewData["Data"] = dt;
        //ViewData["Poll"] = "Testing";
        return View(dt);
    }

我看的代码如下:

    <%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>
<%@ Import Namespace = "MvcApplication3.Models" %>
<%@ Import Namespace = "System.Data" %>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Details
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<%= Html.Encode(ViewData["Data"])%>
</asp:Content>

如何从对 Oracle 完成的选择查询中获取数据表,并将其显示在 MVC 中的视图中

我建议您的第一件事是使用 ODP.NET 驱动程序访问 Oracle 数据库而不是 ODBC。我建议您的第二件事是使用模型而不是经典WebForms中使用的DataSetDataTables(即使它们不应该使用),但不是在MVC中使用 ASP.NET。

因此,一旦您从Oracle下载了正确的驱动程序,让我们开始编码。首先描述什么是Question。例如:

public class Question
{
    public int Id { get; set; }
    public string Title { get; set; }
}

然后编写一个存储库方法,该方法将返回问题列表:

public IEnumerable<Question> GetQuestions()
{
    using (var conn = new OracleConnection("put your CS string here or fetch from app.config"))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "SELECT MCQ_ID, MCQ_TITLE FROM MCQ_QUESTIONS WHERE Poll_ID = 1";
        using (var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                yield return new Question
                {
                    Id = reader.GetInt32(reader.GetOrdinal("MCQ_ID")),
                    Title = reader.GetString(reader.GetOrdinal("MCQ_TITLE"))
                };
            }
        }
    }
}

现在我们可以转到控制器:

public ActionResult Index()
{
    var questions = repository.GetQuestions().ToArray();
    return View(questions);
}

最后是相应的强类型视图:

<%@ Page Title="" 
         Language="C#" 
         MasterPageFile="~/Views/Shared/Site.Master" 
         Inherits="System.Web.Mvc.ViewPage<IEnumerable<MvcApplication3.Models.Question>>" 
%>
<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
    Details
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
    <table>
        <thead>
            <tr>
                <th>Id</th>
                <th>Title</th>
            </tr>
        </thead>
        <tbody>
            <%= Html.DisplayForModel() %>
        </tbody>
    </table>
</asp:Content>

最后在相应的显示模板(~/Views/Shared/DisplayTemplates/Question.ascx):

<%@ Control 
    Language="C#" 
    Inherits="System.Web.Mvc.ViewUserControl<MvcApplication3.Models.Question>" 
%>
<tr>
    <td><%= Html.DisplayFor(x => x.Id) %></td>
    <td><%= Html.DisplayFor(x => x.Title) %></td>
</tr>

您还可以在此处查看有关使用实体框架作为 ORM 以避免在代码中编写 SQL 查询的教程。

尝试查看此处:

在 MVC 中显示标准数据表

这可能很有趣:

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