针对[sample-01]做如下处理,注意下面代码:
| 以下为引用的内容: Public Shared Function getOEMPN(ByVal psPN As String, ByRef OEMPN As String) As BSResultDim clsResult As New BSResult
 Try
 clsResult.ResultID = -1
 Dim dtResult As New DataTable
 Dim Sql As String = String.Empty
 Dim clsOraDb As New clsOraClienDb
 Dim strConn As String =
ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionStringclsOraDb.Open(strConn)  注释:这里Open后,后面看不到 clsOraDb.Close
 Sql = "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 Then
 Return clsResult
 End If
 If dtResult Is Nothing Then
 Return clsResult
 End If
 If dtResult.Rows.Count > 0 Then
 OEMPN = dtResult.Rows(0)("FRUNO").ToString()
 Else
 OEMPN = ""
 End If
 clsResult.ResultID = 1
 clsOraDb.Close  注释:后面看到 clsOraDb.Close
 Return clsResult
 Catch ex As Exception
 clsOraDb.Close 注释:程序异常也看到 clsOraDb.Close
 clsResult.ResultID = -1
 Return clsResult
 Throw ex
 End Try
 End Function
 | 
注意上面的两句代码:clsOraDb.Close和clsOraDb.Close;
在异常处理的时候,特别提醒两点:
(1)你的数据库关闭的时候应该是在代码行0028前,而不是后;
(2)有人不习惯(或者一时疏忽)加上0088行的代码;
针对[Sample-02]和[sample-03],把打开数据库连接写在所有的循环语句之前,如:
| 以下为引用的内容: clsOraDb.Open(strConn)Foreach(DataRow row in tabl.select(“”,”ProductID”)
 ……………
 
 ………….
 Next
 | 
当然还有另外一个做法,就是用Using语句,提交.NET应用的垃圾收集器自动收集;相关的文章很多;这里不再特别赘述。
2.对象只管创建应用,不管释放篇
我们继续用[Sample-01]的代码:
Dim dtResult As New DataTable
谁会发现它被释放,你不能,我也不能,从来没有被释放过。
“Dim dtResult As New DataTable”行的代码解释是,要在内存划分一个空间给这个定义的对象dtresult;系统要划分多大的空间呢?呀,我没有研究过(留给那些有心人吧,呵呵。.);但有一点,要在内存划分一个空间,就是要占用内存;那么内存有多大呢,不是无限大吧;也是有限的;所有运行上述代码的最终结果是,系统的执行效率越来越慢;有人就怀疑,我有内存1到2G的,加上虚拟内存就更大;我只能说你的怀疑没错;可是你的应用程序就用这么一只函数吗?我想肯定不是;所以上百只函数的应用执行对内存的消耗可想而知;如果是后台自动运行的程序,及时是一个function,也会让系统崩溃;这只是一个简单的例子,有更复杂的;象这样的对象应用还有:Dataset, Datatable,DataReader,DataAdapter,Datagrid.。等;
那么怎么解决这些问题呢?
(1)在Try catch 语句前定义好所用的对象; 如:
| 以下为引用的内容: Dim dtResult As New DataTableDim DR as New DataReader
 Dim DS as New Dataset
 Try
 ..
 Catch ex As Exception
 | 
(2)释放的语句如下:
| 以下为引用的内容: Dim dtResult As New DataTableDim DR as New DataReader
 Dim DS as New Dataset
 Try
 ..
 ……………..
 Catch ex As Exception
 --释放应用的对象
 Throw ex
 Finally
 --使用完后,释放应用的对象
 dtResult.dispose  --从内存里清楚该
 | 
 有人习惯写成下面这样:
| 以下为引用的内容: Dim dtResult As New DataTableDim DR as New DataReader
 Dim DS as New Dataset
 Try
 ..
 ‘使用完后,释放应用的对象
 dtResult.dispose  ‘从内存里清楚该对象
 DR.dispose    ‘从内存里清楚该对象
 DS.dispose    ‘从内存里清楚该对象
 Catch ex As Exception
 | 
这不是也释放了吗?我想问的是,如果程序出现异常,它们会释放吗?我肯定得告诉大家,它们一定不能释放。为了确保程序的稳定运行,我建议大家都来用Try Catch语句。
(3)绝不建议在循环语句写如下的语句:
| 以下为引用的内容: 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”)
 | 
 正确的写法是:
| 以下为引用的内容: Dim DS new Dataset Dim DT new Databable…
 Try
 Foreach (DataRow row in tabl.select(“”,”ProductID”)
 DS=nothing  ‘每次使用,都先把内存空间释放出来
 DT=nothing  ‘每次使用,都先把内存空间释放出来
 DS=GetDatase
 DT=GetDatatable……………
 .
 ………….
 Next
 Catch ex As Exception
 Throw ex
 Finally
 DS.dispose
 DT.dispose
 End Try
 | 
另外,提醒大家一点,记得用 For Each 语句替代For i=0 to Rowcount-1;这样的效率改善也是明显的;
. 
分页: [
1] [
2] [
3] 
TAG: 
开发者 NET 引以为戒