一直以来我都特别讨厌形式主义,慢慢地发现不只是生活中,就连学习上也是这么多的形式主义,我想鄙视那些说话办事形式主义的人,可是他们又常常真的把事情办得很好;参加比赛写个文档,自己写的那叫一个“淳朴”,再看人家的,程式化的语言,格式又正确,按套路来哪里都规范。就连写代码相当一部分都是Ctrl+C,Ctrl+V过去的,因为代码中就有大量的程式化的东西。现在才知道,形式主义常常让我们有法可依有章可循,既是规范又可以在保证正确的前提下省去很多力气。
之前专门写过SQLHelper,是为了使代码更简洁才一次一次地重构,最终在D层封装了一个数据库助手类,就是SQLHelper。这样就省去了频繁地写数据库连接和创建命令对象。我写的SQLHelper共有四类,有参无参和查询非查询的组合,以下面两个为例:
''' <summary> ''' 执行不带参数的增删改的方法 ''' </summary> ''' <param name="cmdType">需要执行语句,sql语句或者存储过程</param> ''' <param name="strText">命令类型(文本或者存储过程)</param> Public Function ExecuteNoQuery(ByVal cmdType As CommandType, ByVal strText As String) As Boolean Dim res As Integer Try sqlCmd = New SqlCommand(strText, ConnectSQL()) '创建命令对象 sqlCmd.CommandType = cmdType '执行命令类型 res = sqlCmd.ExecuteNonQuery() '执行增删改操作 Catch ex As Exception Throw ex '捕捉错误 sqlConn.Close() '关闭数据库连接 Return False End Try sqlConn.Close() Return True End Function ''' <summary> ''' 执行带参数的增删改操作 ''' </summary> ''' <param name="sqlParams ">参数数组</param> ''' <param name="cmdType">查询sql语句或者存储过程</param> ''' <param name="strText">命令类型(文本或者存储过程)</param> Public Function ExecuteNoQuery(ByVal sqlParams As SqlParameter(), ByVal cmdType As CommandType, ByVal strText As String) As Boolean Dim res As Integer Try sqlCmd = New SqlCommand(strText, ConnectSQL()) sqlCmd.Parameters.AddRange(sqlParams) sqlCmd.CommandType = cmdType res = sqlCmd.ExecuteNonQuery() Catch ex As Exception Throw ex sqlConn.Close() Return False End Try sqlConn.Close() Return True End Function
这两个函数的函数名相同但参数个数不同,在操作类中根据有无参数来确定要调用哪一个,这是多态。SQLHelper的四个函数代码几乎一样,绝对算得上“形式主义”。
早就听说合作开发的时候写D层几乎没什么,现在看,确实是这样,SQLHelper里面,第一,有参的要写:sqlCmd.Parameters.AddRange(sqlParams)
第二,返回受影响的行数:res = sqlCmd.ExecuteNonQuery()
还是datatable:sdr = sqlCmd.ExecuteReader(CommandBehavior.CloseConnection)
dt.Load(sdr)
除此之外,都可以Ctrl+C了。
操作类也一样,每个方法中,方法名不同调用的存储过程就不同,根据实体确定参数,根据参数和返回值来确定调用sqlhelper的哪个方法。以查看余额为例:
''' <summary> ''' 查看卡内余额接口,根据实体中卡号strCardID查找表T_CardInfo中Balance余额。 ''' </summary> ''' <param name="enCard"></param> Public Function SelectCardBalance(ByVal enCard As CardInfoEntity) As DataTable Implements ISQLCardInfoDAL.SelectCardBalance Dim strSql As String '定义执行命令字符串 Dim dt As DataTable '定义返回值变量 Dim sqlParames As SqlParameter() '定义存储过程中的参数组合 sqlParames = New SqlParameter() { New SqlParameter("@cardID", enCard.strCardID) } strSql = "PROC_SelectCardBalance" '存储过程名赋值 dt = sqlHelper.GetDataTable(sqlParames, CommandType.StoredProcedure, strSql) '调用sqlhelper方法 Return dt End Function
一个函数写完了就约等于整个D层都写完了,其实我们定义一个函数,就是为了避免相同的程序段在程序中重复出现,在需要它时只需要调用相应的函数。这样不仅可以使我们编写的程序精简,而且可以使我们的程序更富有可读性。看看形式主义有多么高效和便利!