技术开发 频道

.NET开发者常会忽略的几个错误

    让我们谈谈数据库连接的问题,在Oracle数据库里,一般默认的数据库连接数最多也就100多来个,不会超过200个,即使你改变这个连接数,但无论怎样,它的连接数是有限的,不可能无限地供你消耗。
    
    在Web这个程式里,它不仅不会自动关闭数据库连接,象这样的函数还会每次调用,都会重新用掉一个数据库连接;如果象这样的函数很多的话,你就等着一个错误警告页面弹出来,如Database Connection Timeout….等讯息。
    
    这还不算什么,更有甚者,尽然在循环语句里写下面的代码如 :

[Sample-02]
Foreach(DataRow row in tabl.select(“”,”ProductID”)
……………
clsOraDb.Open(strConn)
………….
Next
有人还喜欢玩下面的语句:
[Sample-03]
Foreach(DataRow row in tabl.select(“”,”ProductID”)
Foreach(DataColumn col in tbl.columns)
……………
clsOraDb.Open(strConn)

Next
………….
Next 

    说到这,有人就问啦,我在开发环境下测试一点问题都没有呀?是呀,你是没有问题,我想问的是,你开发环境的测试数据有几笔?
   
    现在,问题已经知道在哪里,怎么解决?

    针对[sample-01]做如下处理,注意下面代码:
 

Public Shared Function getOEMPN(ByVal psPN As String, ByRef OEMPN As String) As BSResult
0001 Dim clsResult As New BSResult
0002 Try
0003 clsResult.ResultID = -1
0004 Dim dtResult As New DataTable
0005 Dim Sql As String = String.Empty
0006 Dim clsOraDb As New clsOraClienDb
0007 Dim strConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
0008 clsOraDb.Open(strConn) 注释:这里Open后,后面看不到 clsOraDb.Close
0009 Sql = "SELECT SATBMMBRND.OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND.MATNO = :MATNO"
0010 Dim params() As OracleParameter = {New OracleParameter("MATNO", psPN)}
0011 If clsOraDb.FillDataTable(Sql, dtResult, params) = False Then
0012 Return clsResult
0013 End If
0014 If dtResult Is Nothing Then
0015 Return clsResult
0016 End If
0017 If dtResult.Rows.Count > 0 Then
0018 OEMPN = dtResult.Rows(0)("FRUNO").ToString()
0019 Else
0020 OEMPN = ""
0021 End If
0022 clsResult.ResultID = 1
0088 clsOraDb.Close 注释:后面看到 clsOraDb.Close
0023 Return clsResult
0024 Catch ex As Exception
0099 clsOraDb.Close 注释:程序异常也看到 clsOraDb.Close
0025 clsResult.ResultID = -1
0026 Return clsResult
0028 Throw ex
0027 End Try
End Function


    注意上面的两句代码:0088行和0099行。

    在异常处理的时候,特别提醒两点:

    一, 你的数据库关闭的时候应该是在代码行0028前,而不是后;

    二, 有人不习惯(或者一时疏忽)加上0088行的代码;

    针对[Sample-02]和[sample-03],把打开数据库连接写在所有的循环语句之前,如:
 

clsOraDb.Open(strConn)
Foreach(DataRow row in tabl.select(“”,”ProductID”)
……………

………….
Next
 

    当然还有另外一个做法,就是用Using语句,提交.NET应用的垃圾收集器自动收集;相关的文章很多,这里不再特别赘述。
 

0
相关文章