当前位置:编程学习 > C#/ASP.NET >>

mvc如何写个数据访问层?

习惯了asp.net 的

 public DataTable Getdata ( string i_sqlstr )
    {
        DataTable temptable = new DataTable ( );
        DataSet ds = new DataSet ( );

        try
        {
               SqlDataAdapter m_MyDataAdapter = new SqlDataAdapter ( i_sqlstr, Static_Conn );
            Static_Conn.Open ( );
            m_MyDataAdapter.Fill ( ds, "table" );
            temptable = ds.Tables[0];

        }
                return temptable;
    }

MVC 不用linq 实体类等
能否实现这样的 数据访问类?
最好给个DEMO --------------------编程问答-------------------- 可以的啊,

private static SqlConnection cn;          //创建SQL连接
        private static SqlDataAdapter sda;        //创建SQL数据适配器
        private static SqlDataReader sdr;         //创建SQL数据读取器
        private static SqlCommand cmd;            //创建SQL命令对象
        private static SqlParameter param;        //创建SQL参数
        private static DataSet ds;                //创建数据集
        private static DataView dv;               //创建视图

        /// <summary>
        /// 打开数据库连接
        /// </summary>
        private static void Open()
        {
            #region
            var db = new DBServer
            {
                DBName = "FiberPDR",
                //DBName = "ZTAM_PIMSDB_TEST",
                DBPWD = @"#zfoc@data*",
                DBUser = "sa",
                ServerIP = "192.168.2.1"
            };
            cn = new SqlConnection(db.ConnString());
            cn.Open();
            #endregion
        }


        /// <summary>pxoenix
        /// 
        /// 关闭数据库连接
        /// </summary>
        private static void Close()
        {
            #region
            if (cn != null)
            {
                cn.Close();
                cn.Dispose();
            }
            #endregion
        }

        /// <summary>
        /// 创建参数数组
        /// </summary>
        /// <param name="count"></param>
        /// <returns></returns>
        public static SqlParameter[] CreateParams(int count)
        {
            return new SqlParameter[count];
        }


/// <summary>
        /// 获得DataTable对象,返回最后一个表
        /// </summary>
        /// <param name="strSql">SQL语句</param>
        /// <param name="ps"></param>
        /// <returns></returns>
        public static DataTable GetDt(string strSql, SqlParameter[] ps)
        {
            #region
            var ds = GetDs(strSql, ps);
            var i = ds.Tables.Count - 1;
            cmd.Parameters.Clear();
            return ds.Tables[i];
            #endregion
        }
--------------------编程问答-------------------- 1楼的代码是错的 --------------------编程问答--------------------
引用 2 楼 karascanvas 的回复:
1楼的代码是错的
哪错了? --------------------编程问答-------------------- 1L的代码我也能写 
但如何在MVC中应用呢
1个控制器 如何调用呢 
具体些 --------------------编程问答-------------------- 不用实体类,直接返回DataTable? 你可以放到ViewBag里面啊,

类似于:


public ActionResult Index()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("id", typeof(int)));
            dt.Columns.Add(new DataColumn("name", typeof(string)));

            DataRow dr = dt.NewRow();
            dr[0] = 1;
            dr[1] = "a";
            dt.Rows.Add(dr);

            dr = dt.NewRow();
            dr[0] = 2;
            dr[1] = "b";
            dt.Rows.Add(dr);

            ViewBag.Message = dt;

            return View();
        }


然后Index.cshtml:

@{
    ViewBag.Title = "Home Page";
    System.Data.DataTable dt = (System.Data.DataTable)ViewBag.Message;
    for (int i = 0, c = dt.Rows.Count; i < c; i++)
    {
        @dt.Rows[i]["Name"]
    }
}
--------------------编程问答-------------------- 全是静态对象,如果要同时执行两个命令怎么办? --------------------编程问答-------------------- mvc和数据访问层没啥关系啊  用orm可以 用ado一样可以 
把返回view的模型设成dataset datatable这些不就可以了不就可以了 --------------------编程问答-------------------- 额,你要具体点的呀,这个可以不? --------------------编程问答-------------------- 例
之前
datatable d= classobjec.Getdata ("select * from where id=123")
repeater1.datasouce=d;

MVC如何呢? --------------------编程问答--------------------
引用 9 楼 momotomo123 的回复:

之前
datatable d= classobjec.Getdata ("select * from where id=123")
repeater1.datasouce=d;

MVC如何呢?

repeater数据控件类似于一个 循环遍历集合的操作,那么,换到MVC里面后,你将DataTable也进行循环遍历不就行了。。

你没看我5L的小演示吗,其他做法还可以再找找 --------------------编程问答-------------------- --------------------编程问答-------------------- @model IEnumerable<Dog>

<ul>
    @foreach (Dog d in Model)
    {
        <li>
            <span>@d.ID</span><span>@d.Name</span></li>
    }
</ul>

Dog是对象,不建议在View 用DataRow DataTable 这样的东西  --------------------编程问答-------------------- LZ既然写mvc了为啥还要用datatable呢。。。呵呵 --------------------编程问答-------------------- View 前台未必适用 DataRow DataTable 
适用 Ilist 等对象也无所谓
单Models一定要LINQ 或者实体类吗 我还是习惯 sql=select * from 
这样的访问方式
--------------------编程问答-------------------- 看了LZ发的几个回复,我想说的是既然你已经选择 MVC 了,为何不尝试着使用 MVC 所带来的一些特性。
如果数据访问模块一定要返回 DataTable,你可以使用 ViewData 在视图中拿到,然后:

 DataTable dt=ViewData["datasource"] as DataTable;
 foreach(DataRow row in dt)
 {
   //这里写Html,可以是<ul><li>,也可以是 <tr><td>,具体怎么布局自己选择吧
   //例如:
   <tr>
      <td>产品名称<td>
      <td>产品类别<td>
   </tr>
   <tr>
      <td>row["ProductName"]<td>
      <td>row["ProductTypeName"]<td>
   </tr>
 }


不过我觉得这样就已经有些本末倒置,失去了 MVC 视图应有的强类型的便利。

PS:你一楼的数据访问代码也有问题,全都是静态类,数据库打开了之后也没有关闭。
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,