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吗?

  • 相关阅读:
    Metasploit学习记录---Nessus安装部署
    网络基础配置--usg系统升级
    Centos6.5部署Rsyslog-日志的存储方式及监测服务状态
    Centos6.5部署Rsyslog+cron+rsync备份服务器
    网络基础配置--开启SSH,关闭Telnet
    Centos6.5部署Rsyslog+LogAnalyzer中文乱码解决
    Centos6.5部署Rsyslog+LogAnalyzer收集网络及系统日志
    CactiEZ安装与配置-监控网卡流量
    Storyboard 按照比例布局
    (Swift) UIImagePickerController照片选择器UIImagePickerControllerReferenceURL的问题
  • 原文地址:https://www.cnblogs.com/victorlee/p/3088172.html
Copyright © 2011-2022 走看看