免费邮箱 |加入收藏 | 会员中心 | 我要投稿 | RSS
您当前的位置:首页 > .NET专区 > ASP.NET技巧

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

时间:2011-05-16 20:03:41  来源:站内  作者:潘春会

.NET开发过程中不是程式的无法运行,就是程式的效率慢的同蜗牛在爬; 这种情况在.NET的新手中尤其常见;我不知道为什么,一些介绍.NET开发的书本里引用的例子代码,也对此问题视而不见,尤其让我郁闷的是一些我喜欢的书也出现了同样的问题。

这篇文章不仅对.NET开发者的新手有帮助,同样对哪些有经验,也带来一些启示和参考。

他们会遇到什么样的问题?

1. 数据库连接超时

2. 创建的对象只管用,不管释放

3. 调试(Debug)模式下编译后,就用于应用环境中了

4. 实际作业模式分享

上面的问题就像毒瘤,积累到一定程度就爆发,且影响深远。

1.数据库连接超时篇

若要知道数据库连接超时问题,先看下面一段代码:

[sample-01]

Public Shared Function getOEMPN(ByVal psPN As String, ByRef OEMPN As String) As BSResult
Dim 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").ConnectionString
clsOraDb.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
Return clsResult
Catch ex As Exception
clsResult.ResultID = -1
Return clsResult
End Try
End Function
对上述代码行的部分解释:

Dim clsOraDb As New clsOraClienDb:引用数据库连接的类;

clsOraDb.Open(strConn):打开数据库连接;

然后,整个函数你再找不到关闭数据库连接的动作,是要等着操作系统来释放吗? 有人就说啦,看起来好像没有什么大不了的,这仅仅是一个函数而已; 数据库打开连接,未关闭不会影响到整个应用程式; 果真是这样吗?

让我们谈谈数据库连接的问题,在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 BSResultDim clsResult As New BSResultTryclsResult.ResultID = -1Dim dtResult As New DataTableDim Sql As String = String.EmptyDim clsOraDb As New clsOraClienDbDim strConn As String = ConfigurationManager.ConnectionStringsectionStringclsOraDb.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 > 0 ThenOEMPN = dtResult.Rows(0)("FRUNO").ToString()ElseOEMPN = ""End IfclsResult.ResultID = 1clsOraDb.Close 注释:后面看到 clsOraDb.CloseReturn clsResultCatch ex As ExceptionclsOraDb.Close 注释:程序异常也看到 clsOraDb.CloseclsResult.ResultID = -1Return clsResultThrow exEnd TryEnd Function

注意上面的两句代码:clsOraDb.Close和clsOraDb.Close;

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

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

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

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

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

来顶一下
返回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
推荐资讯
如何找出DHCP地址池里未使用的IP地址
如何找出DHCP地址池里
国内常用的DNS列表
国内常用的DNS列表
Linux邮件服务器软件比较
Linux邮件服务器软件比
学用纯CSS打造可折叠树状菜单
学用纯CSS打造可折叠树
相关文章
栏目更新
栏目热门