首页 > 解决方案 > 在一个 select 语句中使用 OleDb 连接到 2 个不同的 Access 表。C#MVC 4

问题描述

好的,这一直在绞尽脑汁,我已经尝试了一切。包括梳理本站,google,无处不在。我正在尝试从 MVC C# 中的一个数据库 (My HR.mdb) 连接到 2 个不同的 Access 数据库表(一个名为 PhoneList 和一个名为 Employee),我希望能够在一个 SELECT 语句中完成。我这样做的原因是因为我想从一个表中填充一个网格并从另一个表中填充一个标签。我在这里使用 Grid.Mvc:https ://archive.codeplex.com/?p=gridmvc现在,网格填充得很好,但是当我弄乱 SELECT 语句时,它开始破坏东西。我会在我的代码中发表评论,这样你们就可以看到我在说什么。哦,我试过使用 UNION、UNION ALL 和一切都无济于事。在这一点上,我没有选择。当我说我不是数据库专家时,请相信我。所以我知道代码是错误的和/或可能不是最好/最有效的方法。所以请对我放轻松。(-: 哦,我可能会有不止一个问题。首先,我的控制器代码:

    public ActionResult Contact()
{
    var model = new List<Contact>();
    string connString = ConfigurationManager.ConnectionStrings["MyHR"].ToString();
   //string SqlString = "SELECT First_Name, Last_Name FROM Employee";

    using (OleDbConnection conn = new OleDbConnection(connString))
    {
        conn.Open();
        using (OleDbCommand cmd1 = new OleDbCommand("SELECT First_Name, Last_Name FROM Employee", conn))
        {
            cmd1.CommandType = CommandType.Text;
            cmd1.Parameters.AddWithValue("@First_Name", "FirstName");
            cmd1.Parameters.AddWithValue("@Last_Name", "LastName");

            using (OleDbDataReader rdr = cmd1.ExecuteReader())
            {
                while (rdr.Read())
                {
                    string name = string.Empty;
                    var contact = new Contact();
                    name = rdr["First_Name"].ToString() + " " + rdr["Last_Name"].ToString();
                    contact.UserName = name;
                    model.Add(contact);
                }
            }
        }
        using (OleDbCommand cmd2 = new OleDbCommand("SELECT * FROM PhoneList", conn))
        {
            cmd2.CommandType = CommandType.Text;
            cmd2.Parameters.AddWithValue("@First", "First Name");
            cmd2.Parameters.AddWithValue("@Last", "Last Name");
            cmd2.Parameters.AddWithValue("@Extension", "Extension");
            cmd2.Parameters.AddWithValue("@EMail", "EMail");
            cmd2.Parameters.AddWithValue("@Department", "Department");
            cmd2.Parameters.AddWithValue("@Supervisor", "Supervisor");
            cmd2.Parameters.AddWithValue("@SupervisorEntension", "Supervisor Extension");

            using (OleDbDataReader rdr = cmd2.ExecuteReader())
            {
                while (rdr.Read())
                {
                    var contact = new Contact();
                    contact.First = rdr["First"].ToString();
                    contact.Last = rdr["Last"].ToString();
                    contact.Extension = rdr["Extension"].ToString();
                    contact.EMail = rdr["EMail"].ToString();
                    contact.Department = rdr["Department"].ToString();
                    contact.Supervisor = rdr["Supervisor"].ToString();
                    contact.SupervisorEntension = rdr["SupervisorEntension"].ToString();
                    model.Add(contact);
                }
            }
        }
    }
    return View(model);
}

我的型号代码:

using System;
using System.ComponentModel.DataAnnotations;
using System.Web.Mvc;

namespace Contact_Page.Models
{
    public class Contact
    {
        public string UserName { get; set; }//For the label

        public string First { get; set; }

        public string Last { get; set; }

        public string Extension { get; set; }

        public string EMail { get; set; }

        public string Department { get; set; }

        public string Supervisor { get; set; }

        public string SupervisorEntension { get; set; }
    }
}

我的观点:

@model IEnumerable<Contact_Page.Models.Contact><=I can comment out to use label and not grid.
@*@model Contact_Page.Models.Contact*@<=I can comment out to use grid and not label.
@using GridMvc.Html
@{
    ViewBag.Title = "Employee Dashboard and their roles.";
}
@using (Html.BeginForm())
{
  <nav class="navbar navbar-xs navbar-inverse">
    <!--Some more HTML stuff...-->
      @Html.LabelFor(model => model.UserName) or @Html.Label()
  </nav>
  <div class="container">
        <div class="row">
            <div class="col-md-12">
                @Html.Grid(Model).Columns(columns =>
                    {
                        columns.Add(c => c.First).Titled("First Name").SetWidth(50).Filterable(true);
                        columns.Add(c => c.Last).Titled("Last Name").SetWidth(50).Filterable(true);
                        columns.Add(c => c.Extension).Titled("Extension").SetWidth(50).Filterable(true);
                        columns.Add(c => c.EMail).Titled("EMail").SetWidth(50).Filterable(true);
                        columns.Add(c => c.Department).Titled("Department").SetWidth(50).Filterable(true);
                        columns.Add(c => c.Supervisor).Titled("Supervisor").SetWidth(50).Filterable(true);
                        columns.Add(c => c.SupervisorEntension).Titled("Supervisor Extension").SetWidth(50).Filterable(true);
                    }).WithPaging(10)
            </div>
        </div>
    </div><!--/container-->
}

好的,现在是关于标签的第二个问题。如果我注释掉第一行@model IEnumerable<Contact_Page.Models.Contact>Html.Label 控件不会给出红色波浪,但我不能使用网格控件。如果我@model Contact_Page.Models.Contact注释掉另一个注释并取消注释,我可以使用网格但不能使用标签。我试图通过使用这样的普通 HTML 标签来解决这个问题:<label id="UserName"></label>但没有成功。有什么想法吗?还有一件事,以防有人想知道。我首先尝试连接到 Employee 表的原因是从那里拉出 First_Name 和 Last_Name 并将其放在我页面顶部的标签中,这样无论是谁在这个(内部网站,而不是互联网site) 将看到他们的名字。这将不是一个面向外部的站点。仅限内部。在这个特定的表中,当我在服务器资源管理器中打开它时,我注意到它只会显示我的信息,因为它包含 SSN 和生日等敏感信息。我认为我们的 DBA 已将其锁定,因此我只能看到我的信息,可能是权限问题。这对我来说很好。所以我想“嘿,我会从那里获取名字和姓氏并将其放入标签中。” 所以,这可能吗?我在网上看到了很多连接 SELECT 语句的示例,但对我没有任何帮助。哦,当我在这里设置断点时:

name = reader["First_Name"].ToString() + " " + reader["Last_Name"].ToString();
contact.UserName = name;

我可以从 Employee 表中看到我的名字和姓氏,但它不会填充标签。如果有人可以帮助我提供一些工作代码,我将非常感激。多谢你们。对不起,这太长了。

标签: c#asp.net-mvc-4oledbjet

解决方案


推荐阅读