zoukankan      html  css  js  c++  java
  • 04 DW.NET+LINQ, 与MVC混合使用

    DW.NET+LINQ, 与MVC混合使用

    刚发现,本文系列的文章在CSDN上被人“转载”了,上面还没写是转载,就像是他(她)自己写得似的那么泰然自若的放在那。至少给俺把名字留着啊,为啥删掉呢?

    不过无所谓了……

    a2222222222 出品,必是精品  

    如果你有问题需要和我探讨,请发送到:victor.cn.lee@gmail.com 我可能比较懒,很多天都不看邮件,但如果你能指出我的错误,我将非常感谢。

    =============================================

    先进的人士发现,.NET的B/S模式据说是很浪费资源,于是人们想出来用MVC方式解决问题(JAVA的一种思想),于是,VS2010就开始支持了MVC3,MVC4。据说使用了MVC之后,系统资源变得更为有效率,例如,可以多个页面共用一个数据连接,等等,原来只能容纳100个连接的.NET程序据说能连接300多个连接了,我也没试过,反正各种好处。

    那么.NET MVC方式下,DW.NET控件这种“服务器控件”还怎么用啊,都Model,View, Control分开了,你DW.NET把View,Control集中在一起的服务器控件还怎么用?下面就说说怎么用。

    1、服务器控件直接用到MVC的VIEW中是不可以的。

    VIEW只支持标准的HTML,没有给服务器控件留地方。那种想把下面的代码直接拷贝到.cshtml文件中的想法,赶紧放弃掉。只能是建立一个新文件夹,与View, Model, Controllers的平级文件夹,里面放着新的ASP.NET类,然后不要再controller的函数中写代码,直接使用链接即可。

    步骤:

    (1)    建立一个新文件夹,与View, Model, Controllers的平级文件夹,例如TechTest

     

    (2)在TechTest目录下,新建一个类

     

    这时候,添加的这个类应该选择的是 “Web窗体”,就是我们以前习惯的WEB开发页面了:

     

    WEB窗体建立好后,就可以拖动工具箱中的Webdatawindow到页面上,如下:

     

    您自己设置一下librarylist,datawindowobject属性。

    2、常规情况下Datawindow.NET连接数据库和检索数据方法

    Sybase.DataWindow.Transaction Trans = new Sybase.DataWindow.Transaction { Dbms = Sybase.DataWindow.DbmsType.OleDb };

    Trans.Password = "";

    Trans.UserId = "sa";

    Trans.DbParameter = "PROVIDER='SQLOLEDB',DATASOURCE='127.0.0.1',PROVIDERSTRING='database=testdatabase'";

    Trans.Connect();

    WebDataWindowControl1.SetTransaction(Trans);

    WebDataWindowControl1.Retrieve("","") //检索参数 会PB的人都懂

    上面的语句基本上不用我多解释。可是MVC方式下,尽管你用了WEB窗体,也要尽量不要自己去写数据连接,尽量用.NET提供的更好的功能,比如说LINQ.

    3、使用LINQ

    LINQ是什么?你把他当成数据库,尽管不妥当,但是不影响理解。想深入了解这个的话?学学我们一个黄老师的话:那么你是女同学的话,下课了来找我,我们探讨下?……

    (悄悄告诉你,我也不会……你会来吗?)

     

    (1)添加一个LINQ to SQL类,名字:DataClasses1

     

    将一个表拖到LINQ to SQL中

    例如这个表:airport

    (2)       将表中的数据填写到DataTable中

             DataClasses1DataContext ccc = new DataClasses1DataContext();

                var airportdata = from airport in ccc.airport

                                  select new

                                  {

                                      code = airport.code,

                                      airport = airport.airport1

                                  };

                DataTable tabletrans = LinqToDataTable.ToDataTable(airportdata.ToList());

    (3)       ToDataTable这个函数,是将LINQ的数据集合放入datable中,代码如下:

          public static System.Data.DataTable ToDataTable<T>(IEnumerable<T> data)

            {

                var dt = new System.Data.DataTable();

                var ps = typeof(T).GetProperties().ToList();

                ps.ForEach(p => dt.Columns.Add(p.Name, p.PropertyType));

     

                foreach (T t in data)

                {

                    var dr = dt.NewRow();

                    var vs = from p in ps select p.GetValue(t, null);

                    var ls = vs.ToList();

                    int i = 0;

                    ls.ForEach(c => dr[i++] = c);

                    dt.Rows.Add(dr);

                }

                return dt;

            }

    (4)       剩下的就是检索了,DW.NET现在支持将Datatable作为数据源来检索数据:

    WebDataWindowControl1.Retrieve(tabletrans);

    简单不?

    (5)NULL数据的处理  很重要!

    其实以上的代码就足够检索数据了,但是,所有的代码都会有个缺陷:NULL数据的处理。如果上面数据都有值,没有NULL,那么就不出错。事实上,许多数据库中,NULL是经常要存在的。

    所以不能简单的将数据直接RETRIEVE, 特殊做一个方法:

     PublicCallClass.DataWindowFillData(tabletrans,WebDataWindowControl1);

    这个方法就是将Datatable中的数据填入dw.net控件中:

           public static void DataWindowFillData(DataTable table, Sybase.DataWindow.Web.WebDataWindowControl dwObj)

            {         

               dwObj.Reset();

                try

                {

                    dwObj.Retrieve(table);

                }

                catch (Exception)

                {

                    dwObj.Reset();

                   

                    for (int i = 0; i < table.Rows.Count; i++)

                    {

                        int iRowNo = dwObj.InsertRow(i + 1);

                        for (int j = 0; j < table.Columns.Count; j++)

                        {

                            if (table.Rows[i][j] == null) break;

                            string sColName = table.Columns[j].ColumnName;

                            string strJudgeColExist = dwObj.Describe(sColName + ".id");

                            if (strJudgeColExist == "?" || strJudgeColExist == "!" || strJudgeColExist == "" || strJudgeColExist == null) break;

                            string sColType = dwObj.Describe(sColName + ".coltype");

     

                            switch (sColType.Substring(0, 4))

                            {

                                case "char":

                                    if (table.Rows[i][j] != System.DBNull.Value)

                                    {

                                        string str_datavalue = table.Rows[i][j].ToString();

                                        dwObj.SetItemString(iRowNo, sColName, str_datavalue);

                                    }

                                    break;

                                case "deci":

                                    if (table.Rows[i][j] != System.DBNull.Value)

                                    {

                                        decimal dec_temp = System.Convert.ToDecimal(table.Rows[i][j]);

                                        dwObj.SetItemDecimal(iRowNo, sColName, dec_temp);

                                    }

                                    break;

                                case "date":

                                    if (table.Rows[i][j] != System.DBNull.Value)

                                    {

                                        DateTime datetime_temp = System.Convert.ToDateTime(table.Rows[i][j]);

                                        dwObj.SetItemDateTime(iRowNo, sColName, datetime_temp);

                                    }

                                    break;

                                case "numb":

                                case "long":

                                    if (table.Rows[i][j] != System.DBNull.Value)

                                    {

                                        int i_temp = System.Convert.ToInt32(table.Rows[i][j]);

                                        dwObj.SetItemDouble(iRowNo, sColName, i_temp);

                                    }

                                    break;

                                default:

                                    break;

                            }

     

                        }

                    }

     

                }

                dwObj.ResetUpdateStatus();

            }

     

    这么下来,这个就比较贴近MVC的方式了。怎么样,你还畏惧MVC吗?

  • 相关阅读:
    Linux 学习 step by step (1)
    ubuntu server nginx 安装与配置
    ubuntu server samba服务器配置
    iOS app集成支付宝支付流程及后台php订单签名处理
    mac 连接windows 共享内容
    linux 文件查找,which,whereis,locate,find
    ubuntu server vsftpd 虚拟用户及目录
    ubuntu server 安装 mantis bug tracker 中文配置
    ubuntu server vsftpd 匿名用户上传下载及目录设置
    linux 用户管理,用户权限管理,用户组管理
  • 原文地址:https://www.cnblogs.com/victorlee/p/3088172.html
Copyright © 2011-2022 走看看