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

原文地址:https://www.cnblogs.com/victorlee/p/3088172.html