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