ASP.NET网页设计.NET开辟过程当中易被无视的成绩
那做企业软件是不是最好用J2EE?在使用Visiolstudio.NET开辟Web使用程式中,开辟者经常会碰到一些成绩:如我开辟好的程式,在开辟情况下测试没成绩,怎样一搬到使用情况下,就会有成绩?在使用Visiolstudio.NET开辟Web使用程式中,开辟者经常会碰到一些成绩:如我开辟好的程式,在开辟情况下测试没成绩,怎样一搬到使用情况下,就会有成绩?不是程式的没法运转,就是程式的效力慢的同蜗牛在爬,这类情形在.NET的老手中特别罕见。我不晓得为何,一些先容.NET开辟的书籍里援用的例子代码,也对此成绩置若罔闻,特别让我忧郁的是一些我喜好的书,如:<<ADO.NET手艺内情>>,<<ASP.NET2.0初级编程(第4版)>>,这两本都是清华年夜学出书社出书的,有一本书更糟<<VisualBasic.Net专业项目实例开辟>>,我倡议人人仍是不要看了吧,免的华侈工夫和精神。这篇文章不但对.NET开辟者的老手有匡助,一样对哪些有履历,也带来一些启发和参考。
他们会碰到甚么样的成绩,我无妨总结给人人:
1.数据库毗连超时
2.创立的工具尽管用,不论开释
3.调试(Debug)形式下编译后,就用于使用情况中了
4.实践功课形式分享
下面的成绩就像毒瘤,堆集到必定水平就发作,且影响深远。
1、数据库毗连超时篇
若要晓得数据库毗连超时成绩,先看上面一段代码:
:
PublicSharedFunctiongetOEMPN(ByValpsPNAsString,ByRefOEMPNAsString)AsBSResult
0001DimclsResultAsNewBSResult
0002Try
0003clsResult.ResultID=-1
0004DimdtResultAsNewDataTable
0005DimSqlAsString=String.Empty
0006DimclsOraDbAsNewclsOraClienDb
0007DimstrConnAsString=ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
0008clsOraDb.Open(strConn)‘这里Open后,前面看不到clsOraDb.Close
0009Sql="SELECTSATBMMBRND.OEMPNFRUNOFROMSATBMMBRNDWHERESATBMMBRND.MATNO=:MATNO"
0010Dimparams()AsOracleParameter={NewOracleParameter("MATNO",psPN)}
0011IfclsOraDb.FillDataTable(Sql,dtResult,params)=FalseThen
0012ReturnclsResult
0013EndIf
0014IfdtResultIsNothingThen
0015ReturnclsResult
0016EndIf
0017IfdtResult.Rows.Count>0Then
0018OEMPN=dtResult.Rows(0)("FRUNO").ToString()
0019Else
0020OEMPN=""
0021EndIf
0022clsResult.ResultID=1
0023ReturnclsResult
0024CatchexAsException
0025clsResult.ResultID=-1
0026ReturnclsResult
0027EndTry
EndFunction
对上述代码行的部分化释:
0006:援用数据库毗连的类;
0008:翻开数据库毗连;
然后,全部函数你再找不到封闭数据库毗连的举措,是要等着操纵体系来开释吗?有人就说啦,看起来仿佛没有甚么年夜不了的,这仅仅是一个函数罢了;数据库翻开毗连,未封闭不会影响到全部使用程式;果然是如许吗?
让我们谈谈数据库毗连的成绩,在Oracle数据库里,一样平常默许的数据库毗连数最多也就100多来个,不会凌驾200个,即便你改动这个毗连数,但不管如何,它的毗连数是无限的,不成能无穷地供你损耗。
在Web这个程式里,它不但不会主动封闭数据库毗连,象如许的函数还会每次挪用,城市从头用失落一个数据库毗连;假如象如许的函数良多的话,你就等着一个毛病告诫页面弹出来,如DatabaseConnectionTimeout….等讯息。
这还不算甚么,更有甚者,尽然在轮回语句里写上面的代码如:
Foreach(DataRowrowintabl.select(“”,”ProductID”)
……………
clsOraDb.Open(strConn)
………….
Next
有人还喜好玩上面的语句:
Foreach(DataRowrowintabl.select(“”,”ProductID”)
Foreach(DataColumncolintbl.columns)
……………
clsOraDb.Open(strConn)
Next
………….
Next
说到这,有人就问啦,我在开辟情况下测试一点成绩都没有呀?是呀,你是没有成绩,我想问的是,你开辟情况的测试数占有几笔?
如今,成绩已晓得在那里,怎样办理?
针对做以下处置,注重上面代码:
PublicSharedFunctiongetOEMPN(ByValpsPNAsString,ByRefOEMPNAsString)AsBSResult
0001DimclsResultAsNewBSResult
0002Try
0003clsResult.ResultID=-1
0004DimdtResultAsNewDataTable
0005DimSqlAsString=String.Empty
0006DimclsOraDbAsNewclsOraClienDb
0007DimstrConnAsString=ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
0008clsOraDb.Open(strConn)正文:这里Open后,前面看不到clsOraDb.Close
0009Sql="SELECTSATBMMBRND.OEMPNFRUNOFROMSATBMMBRNDWHERESATBMMBRND.MATNO=:MATNO"
0010Dimparams()AsOracleParameter={NewOracleParameter("MATNO",psPN)}
0011IfclsOraDb.FillDataTable(Sql,dtResult,params)=FalseThen
0012ReturnclsResult
0013EndIf
0014IfdtResultIsNothingThen
0015ReturnclsResult
0016EndIf
0017IfdtResult.Rows.Count>0Then
0018OEMPN=dtResult.Rows(0)("FRUNO").ToString()
0019Else
0020OEMPN=""
0021EndIf
0022clsResult.ResultID=1
0088clsOraDb.Close正文:前面看到clsOraDb.Close
0023ReturnclsResult
0024CatchexAsException
0099clsOraDb.Close正文:程序非常也看到clsOraDb.Close
0025clsResult.ResultID=-1
0026ReturnclsResult
0028Throwex
0027EndTry
EndFunction
注重下面的两句代码:0088行和0099行。
在非常处置的时分,出格提示两点:
一,你的数据库封闭的时分应当是在代码行0028前,而不是后;
二,有人不习气(大概一时忽略)加上0088行的代码;
针对和,把翻开数据库毗连写在一切的轮回语句之前,如:
clsOraDb.Open(strConn)
Foreach(DataRowrowintabl.select(“”,”ProductID”)
……………
………….
Next
固然另有别的一个做法,就是用Using语句,提交.NET使用的渣滓搜集器主动搜集;相干的文章良多,这里不再出格赘述。
2、工具尽管创立使用,不论开释篇
我们持续用的代码,我们如今看0004行的代码:
0004DimdtResultAsNewDataTable
谁会发明它被开释,你不克不及,我也不克不及,历来没有被开释过。
“0004”行的代码注释是,要在内存分别一个空间给这个界说的工具dtresult;体系要分别多年夜的空间呢?呀,我没有研讨过(留给那些故意人吧,呵呵..)。但有一点,要在内存分别一个空间,就是要占用内存。那末内存有多年夜呢,不是无穷年夜吧,也是无限的,一切运转上述代码的终极了局是,体系的实行效力愈来愈慢,有人就嫌疑,我有内存1到2G的,加上假造内存就更年夜,我只能说你的嫌疑没错。但是你的使用程序就用这么一只函数吗?我想一定不是,以是上百只函数的使用实行对内存的损耗不可思议。假如是背景主动运转的程序,实时是一个function,也会让体系溃散。这只是一个复杂的例子,有更庞大的。像如许的工具使用另有:Dataset,Datatable,DataReader,DataAdapter,Datagrid..等。
那末怎样办理这些成绩呢:
2.1在Trycatch语句前界说好所用的工具,如:
DimdtResultAsNewDataTable
DimDRasNewDataReader
DimDSasNewDataset
Try
..
CatchexAsException
Throwex
Finally
EndTry
2.2开释的语句以下
DimdtResultAsNewDataTable
DimDRasNewDataReader
DimDSasNewDataset
Try
..
……………..
CatchexAsException
--开释使用的工具
Throwex
Finally
--利用完后,开释使用的工具
dtResult.dispose--从内存里分明该工具
DR.dispose-从内存里分明该工具
DS.dispose-从内存里分明该工具
EndTry
有人习气写成上面如许:
DimdtResultAsNewDataTable
DimDRasNewDataReader
DimDSasNewDataset
Try
..
‘利用完后,开释使用的工具
dtResult.dispose‘从内存里分明该工具
DR.dispose‘从内存里分明该工具
DS.dispose‘从内存里分明该工具
CatchexAsException
‘开释使用的工具
Throwex
Finally
EndTry
这不是也开释了吗?我想问的是,假如程序呈现非常,它们会开释吗?我一定得告知人人,它们必定不克不及开释,为了确保程序的不乱运转,我倡议人人都来用TryCatch语句。
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 现在的ASP.net分为两个版本:1.1和2.0Asp.net1.1用VS2003(visualstudio2003)编程。Asp.net2.0用VS2005(visualstudio2005)编程。现在一般开发用的是VS2003。 有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。 如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。 众所周知,Windows以易用而出名,也因此占据不少的服务器市场。 是目前ASP在UNIX/Linux上的应用可以说几乎为0)。所以平台的局限性和ASP自身的安全性限制了ASP的广泛应用。 提供基于组件、事件驱动的可编程网络表单,大大简化了编程。还可以用ASP.NET建立网络服务。 同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。
页:
[1]