您现在的位置是:首页 >

苹果开发者账号出现未知错误 引以为戒 .NET开发者常犯的错误

火烧 2023-03-21 05:41:00 1095
引以为戒 .NET开发者常犯的错误    NET开发过程中不是程式的无法运行 就是程式的效率慢的同蜗牛在爬 这种情况在 NET的新手中尤其常见 我不知道为什么 一些介绍 NET开发的书本里引用的例子代

引以为戒 .NET开发者常犯的错误  

   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 语句前定义好所用的对象; 如:

苹果开发者账号出现未知错误 引以为戒 .NET开发者常犯的错误
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)模式下编译就用于应用环境中篇

  大家看下面的图片

  
永远跟党走
  • 如果你觉得本站很棒,可以通过扫码支付打赏哦!

    • 微信收款码
    • 支付宝收款码