知识大全 引以为戒 .NET开发者常犯的错误
Posted 语句
篇首语:富贵必从勤苦得,男儿须读五车书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 引以为戒 .NET开发者常犯的错误相关的知识,希望对你有一定的参考价值。
引以为戒 .NET开发者常犯的错误 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!
NET开发过程中不是程式的无法运行 就是程式的效率慢的同蜗牛在爬; 这种情况在 NET的新手中尤其常见 我不知道为什么 一些介绍 NET开发的书本里引用的例子代码 也对此问题视而不见 尤其让我郁闷的是一些我喜欢的书也出现了同样的问题
这篇文章不仅对 NET开发者的新手有帮助 同样对哪些有经验 也带来一些启示和参考
他们会遇到什么样的问题?
数据库连接超时
创建的对象只管用 不管释放
调试(Debug)模式下编译后 就用于应用环境中了
实际作业模式分享
上面的问题就像毒瘤 积累到一定程度就爆发 且影响深远
数据库连接超时篇
若要知道数据库连接超时问题 先看下面一段代码:
[sample ]
Public Shared Function getOEMPN(ByVal psPN As String ByRef OEMPN As String) As BSResultDim clsResult As New BSResultTryclsResult ResultID = Dim dtResult As New DataTableDim Sql As String = String EmptyDim clsOraDb As New clsOraClienDbDim strConn As String = ConfigurationManager ConnectionStrings( ConnectionString ) ConnectionStringclsOraDb Open(strConn) 这里Open后 后面看不到 clsOraDb CloseSql = SELECT SATBMMBRND OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND MATNO = :MATNO Dim params() As racleParameter = New OracleParameter( MATNO psPN)If clsOraDb FillDataTable(Sql dtResult params) = False ThenReturn clsResultEnd IfIf dtResult Is Nothing ThenReturn clsResultEnd IfIf dtResult Rows Count > ThenOEMPN = dtResult Rows( )( FRUNO ) ToString()ElseOEMPN = End IfclsResult ResultID = Return clsResultCatch ex As ExceptionclsResult ResultID = Return clsResultEnd TryEnd Function对上述代码行的部分解释
Dim clsOraDb As New clsOraClienDb:引用数据库连接的类;
clsOraDb Open(strConn):打开数据库连接;
然后 整个函数你再找不到关闭数据库连接的动作 是要等著操作系统来释放吗? 有人就说啦 看起来好像没有什么大不了的 这仅仅是一个函数而已;数据库打开连接 未关闭不会影响到整个应用程式;果真是这样吗?
让我们谈谈数据库连接的问题 在Oracle数据库里 一般默认的数据库连接数最多也就 多来个 不会超过 个 即使你改变这个连接数 但无论怎样 它的连接数是有限的 不可能无限地供你消耗
在Web这个程式里 它不仅不会自动关闭数据库连接 象这样的函数还会每次调用 都会重新用掉一个数据库连接;如果象这样的函数很多的话 你就等著一个错误警告页面弹出来 如Database Connection Timeout…等讯息
这还不算什么 更有甚者 尽然在循环语句里写下面的代码如
[sample ]
Foreach(DataRow row in tabl select( ProductID )……………clsOraDb Open(strConn)………… Next有人还喜欢玩下面的语句:[sample ]Foreach(DataRow row in tabl select( ProductID )Foreach(DataColumn col in lumns)……………clsOraDb Open(strConn)Next ………… Next
说到这 有人就问啦 我在开发环境下测试一点问题都没有呀?是呀 你是没有问题 我想问的是 你开发环境的测试数据有几笔?
现在 问题已经知道在哪里 怎么解决?
针对[sample ]做如下处理 注意下面代码:
Public Shared Function getOEMPN(ByVal psPN As String ByRef OEMPN As String) As BSResultDim clsResult As New BSResultTryclsResult ResultID = Dim dtResult As New DataTableDim Sql As String = String EmptyDim clsOraDb As New clsOraClienDbDim strConn As String =
ConfigurationManager ConnectionStrings( ConnectionString ) ConnectionStringclsOraDb Open(strConn) 注释 这里Open后 后面看不到 clsOraDb CloseSql = SELECT SATBMMBRND OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND MATNO = :MATNO Dim params() As racleParameter = New OracleParameter( MATNO psPN)If clsOraDb FillDataTable(Sql dtResult params) = False ThenReturn clsResultEnd IfIf dtResult Is Nothing ThenReturn clsResultEnd IfIf dtResult Rows Count > ThenOEMPN = dtResult Rows( )( FRUNO ) ToString()ElseOEMPN = End IfclsResult ResultID = clsOraDb Close 注释 后面看到 clsOraDb CloseReturn clsResultCatch ex As ExceptionclsOraDb Close 注释 程序异常也看到 clsOraDb CloseclsResult ResultID = Return clsResultThrow exEnd TryEnd Function
注意上面的两句代码:clsOraDb Close和clsOraDb Close;
在异常处理的时候 特别提醒两点
( )你的数据库关闭的时候应该是在代码行 前 而不是后;
( )有人不习惯(或者一时疏忽)加上 行的代码;
针对[Sample ]和[sample ] 把打开数据库连接写在所有的循环语句之前 如:
clsOraDb Open(strConn)Foreach(DataRow row in tabl select( ProductID )……………………… Next
当然还有另外一个做法 就是用Using语句 提交 NET应用的垃圾收集器自动收集;相关的文章很多 这里不再特别赘述 对象只管创建应用 不管释放篇
我们继续用[Sample ]的代码:
Dim dtResult As New DataTable
谁会发现它被释放 你不能 我也不能 从来没有被释放过
Dim dtResult As New DataTable 行的代码解释是 要在内存划分一个空间给这个定义的对象dtresult;系统要划分多大的空间呢?呀 我没有研究过(留给那些有心人吧 呵呵 ) 但有一点 要在内存划分一个空间 就是要占用内存 那么内存有多大呢 不是无限大吧 也是有限的 所有运行上述代码的最终结果是 系统的执行效率越来越慢 有人就怀疑 我有内存 到 G的 加上虚拟内存就更大 我只能说你的怀疑没错;可是你的应用程序就用这么一只函数吗?我想肯定不是 所以上百只函数的应用执行对内存的消耗可想而知 如果是后台自动运行的程序 及时是一个function 也会让系统崩溃 这只是一个简单的例子 有更复杂的;象这样的对象应用还有:Dataset Datatable DataReader DataAdapter Datagrid 等;
那么怎么解决这些问题呢?
( )在Try catch 语句前定义好所用的对象; 如:
Dim dtResult As New DataTableDim DR as New DataReaderDim DS as New DatasetTry Catch ex As ExceptionThrow exFinallyEnd Try( )释放的语句如下:
Dim dtResult As New DataTableDim DR as New DataReaderDim DS as New DatasetTry …………… Catch ex As Exception 释放应用的对象Throw exFinally 使用完后 释放应用的对象dtResult dispose 从内存里清楚该对象DR dispose 从内存里清楚该对象DS dispose 从内存里清楚该对象End Try有人习惯写成下面这样:
Dim dtResult As New DataTableDim DR as New DataReaderDim DS as New DatasetTry 使用完后 释放应用的对象dtResult dispose 从内存里清楚该对象DR dispose 从内存里清楚该对象DS dispose 从内存里清楚该对象Catch ex As Exception 释放应用的对象Throw exFinallyEnd Try这不是也释放了吗?我想问的是 如果程序出现异常 它们会释放吗?我肯定得告诉大家
它们一定不能释放 为了确保程序的稳定运行 我建议大家都来用Try Catch语句 ( )绝不建议在循环语句写如下的语句
Foreach (DataRow row in tabl select( ProductID )……………Dim DS new Dataset 记住此乃写代码之大忌;Dim DT new Databable… ………… Next 还有一种写法Dim DS new Dataset Dim DT new Databable…Foreach (DataRow row in tabl select( ProductID )DS=GetDataseDT=GetDatatable…………… ………… Next正确的写法是
Dim DS new Dataset Dim DT new Databable…TryForeach (DataRow row in tabl select( ProductID )DS=nothing 每次使用 都先把内存空间释放出来DT=nothing 每次使用 都先把内存空间释放出来DS=GetDataseDT=GetDatatable…………… ………… Next Catch ex As ExceptionThrow exFinallyDS disposeDT disposeEnd Try 另外 提醒大家一点 记得用 For Each 语句替代For i= to Rowcount 这样的效率改善也是明显的;调试(Debug)模式下编译就用于应用环境中篇
大家看下面的图片
相关参考
尽管软件发展中的热点技术层出不穷不断地变化有一些东西却一直未曾改变其中之一就是开发人员对数据库的使用和设计开发 你可能会兴奋地紧跟时尚创建一个AJAXWeb界面或者使用最近迷人的Windows用
第三范式并不是至高无上 另一方面开发人员对数据库的一知半解可能是一件比较危险的事情我看到过很多数据库被设计得过于死板这些数据库的设计者坚持把所有东西都放在查询表中 是的数据库开发者需要知道规范
一、通风透光不好。空杆多,里面的棒比地头、地边的棒小。 二、种子超积温。成熟度不够,水粒子。打不出粮,卖不上价。 三、不耐密的品种盲目加密。控杆、棒小、不耐旱、倒伏、贪青晚熟。 四、缺苗、补苗。
一、通风透光不好。空杆多,里面的棒比地头、地边的棒小。 二、种子超积温。成熟度不够,水粒子。打不出粮,卖不上价。 三、不耐密的品种盲目加密。控杆、棒小、不耐旱、倒伏、贪青晚熟。 四、缺苗、补苗。
装修设计有几个常犯的大错误?1、壁柜做满墙专家剖析在前几年,在墙上做柜子是很盛行的,但是在近些年,墙上做柜子现已渐渐的被大家扔掉了,一方面是在墙上做柜子占用的空间面积很大,另一方面做柜子是为了收纳东西
家庭装修设计有几种常犯的大错误?一、壁柜做满墙专家剖析在前几年,在墙上做柜子是很盛行的,但是在近些年,墙上做柜子现已渐渐的被大家扔掉了,一方面是在墙上做柜子占用的空间面积很大,另一方面做柜子是为了收纳
一、通风透光不好。空杆多,里面的棒比地头、地边的棒小。 二、种子超积温。成熟度不够,水粒子。打不出粮,卖不上价。 三、不耐密的品种盲目加密。控杆、棒小、不耐旱、倒伏、贪青晚熟。 四、缺苗、补苗。
一、通风透光不好。空杆多,里面的棒比地头、地边的棒小。 二、种子超积温。成熟度不够,水粒子。打不出粮,卖不上价。 三、不耐密的品种盲目加密。控杆、棒小、不耐旱、倒伏、贪青晚熟。 四、缺苗、补苗。
一、通风透光不好。空杆多,里面的棒比地头、地边的棒小。 二、种子超积温。成熟度不够,水粒子。打不出粮,卖不上价。 三、不耐密的品种盲目加密。控杆、棒小、不耐旱、倒伏、贪青晚熟。 四、缺苗、补苗。
一、通风透光不好。空杆多,里面的棒比地头、地边的棒小。 二、种子超积温。成熟度不够,水粒子。打不出粮,卖不上价。 三、不耐密的品种盲目加密。控杆、棒小、不耐旱、倒伏、贪青晚熟。 四、缺苗、补苗。