向SqlParameter集合数组中添加参数——SQLHelp对数据访问层的优化(一)
2012-01-03 17:28
495 查看
这是今天下午忙活半天的成果,但不管怎样吧还是达到了想要的目的:通过集合数据自动添加SqlParameter参数到Command命令中。
思路很明确,也很简单,大致的可以分两步。
第一步,将用户输入的存储过程参数写入到一个SqlParameter集合数组中;
第二步,将SqlParameter集合数组中的参数元素导入到Command命令的Parameters集合中。
接下来要做的是分别实现这两步,在第一步中涉及到了vb.net的往数组中写参数的问题,第一次写这个程序,稍微遇到了一些麻烦。第二步中要注意参数类型的问题,正确的代码应该是这样的:
下面的语句就会出现因参数类型不符,而导致无法传值的错误:
针对这样的问题,细心是必须的,但是遇到错误后积极去研究程序的出错原因,对症下药,也是非常重要的。
这里重点说说第一步中如何将用户输入的存储过程的参数,参数类型,参数值传入到集合中。如果直接引用vb.net提供的SqlParameter方法,默认情况下你需要去匹配编译器默认的参数,使用起来不仅不方便,而且还容易出错,因此,就需要自己重新定义一个类完成相似的效果,这里与重写差不多,但并不是重写,因为方法名是自己定义的。
实现如下:先添加一个新的类叫PublicMethod,并在此类中添加一个Param方法,通过这个方法来自定义用户输入格式,把代码贴出来:
下面是自定义的SQLHelp(此类的作用是对数据访问层进行优化)类的代码:
最后看一下优化后的数据访问层:
这里明显要比上一篇博客中的最原始的方法显得干净了好多。
另外据网上的一些说法认为:这种方法还有其他的一些好处,就是不必受集合索引的限制?但是我没有这样的理解,希望高手指点,可以参考下面的连接
http://caixiaodi51.blog.163.com/blog/static/139336285201011462415952/
思路很明确,也很简单,大致的可以分两步。
第一步,将用户输入的存储过程参数写入到一个SqlParameter集合数组中;
第二步,将SqlParameter集合数组中的参数元素导入到Command命令的Parameters集合中。
接下来要做的是分别实现这两步,在第一步中涉及到了vb.net的往数组中写参数的问题,第一次写这个程序,稍微遇到了一些麻烦。第二步中要注意参数类型的问题,正确的代码应该是这样的:
cmd.Parameters.Add(parameters(i))
下面的语句就会出现因参数类型不符,而导致无法传值的错误:
cmd.Parameters.Add(parameters(i).Value)
针对这样的问题,细心是必须的,但是遇到错误后积极去研究程序的出错原因,对症下药,也是非常重要的。
这里重点说说第一步中如何将用户输入的存储过程的参数,参数类型,参数值传入到集合中。如果直接引用vb.net提供的SqlParameter方法,默认情况下你需要去匹配编译器默认的参数,使用起来不仅不方便,而且还容易出错,因此,就需要自己重新定义一个类完成相似的效果,这里与重写差不多,但并不是重写,因为方法名是自己定义的。
实现如下:先添加一个新的类叫PublicMethod,并在此类中添加一个Param方法,通过这个方法来自定义用户输入格式,把代码贴出来:
Imports System.Data.SqlClient Public Class PublicMethod ''' <summary> ''' 创建一个包含参数名、参数类型、参数值的SqlParameter ''' </summary> ''' <param name="pameterName">参数名</param> ''' <param name="dbType">参数类型</param> ''' <param name="pameterValue">参数值</param> ''' <returns>SqlParameter</returns> ''' <remarks></remarks> Public Function Param(ByVal pameterName As String, ByVal dbType As SqlDbType, ByVal pameterValue As Object) As SqlParameter Dim sqlParameter As New SqlParameter sqlParameter.ParameterName = pameterName sqlParameter.Value = pameterValue sqlParameter.DbType = dbType Return sqlParameter End Function End Class
下面是自定义的SQLHelp(此类的作用是对数据访问层进行优化)类的代码:
''' <summary>
''' 指定存储过程名和传入的参数集合,返回查询的第一行第一列对象
''' </summary>
''' <param name="storedProcecureName">要使用的存储过程名</param>
''' <param name="parameters">要传给Command的Parameters参数集合</param>
''' <returns>查询结果的第一行的第一列</returns>
''' <remarks></remarks>
Public Function ExecuteProcedureScalar(ByVal storedProcecureName As String, ByVal parameters As SqlParameter()) As Object
Dim conn As New SqlConnection(connStr)
Dim cmd As New SqlCommand(storedProcecureName, conn)
Dim i As Integer
cmd.CommandType = CommandType.StoredProcedure
Try
If IsNothing(parameters) = False Then
'将集合/数组中的参数,逐个添加到cmd.Parameters中。
For i = 0 To parameters.Count - 1
cmd.Parameters.Add(parameters(i).Value)
Next
'或是下面的方法
'Dim Parameter As New SqlParameter
'For Each Parameter In parameters
' cmd.Parameters.Add(Parameter)
'Next
End If
conn.Open()
Return cmd.ExecuteScalar
Catch ex As Exception
MsgBox(ex.Message)
Return Nothing
Finally
conn.Close()
cmd.Dispose()
cmd = Nothing
End Try
End Function
最后看一下优化后的数据访问层:
Imports System.Data.SqlClient Imports Utility Imports System.Windows.Forms Public Class UserDAL Inherits PublicMethod '实现数据访问层的接口 Implements IDAL.IUserDAL Private Parame As New Utility.PublicMethod Private sqlHelp As New Utility.SQLServerDALHelp ''' <summary> ''' 读取用户密码 ''' </summary> ''' <param name="modelUser">用户实体类</param> ''' <returns>密码</returns> ''' <remarks></remarks> Public Function GetPwd(ByVal modelUser As Model.User) As String Implements IDAL.IUserDAL.GetPwd Dim user_Pwd As String Dim spName As String spName = "proc_GetUserPwd" Dim Paramters As SqlParameter() = Nothing '定义一个集合/数据来盛放所有的存储过程需要的参数, '然后将向相应的参数写入集合/数组中。 Try Paramters = New SqlParameter() {Parame.Param("@User_Pwd", SqlDbType.VarChar, modelUser.User_Pwd), Parame.Param("@User_ID", SqlDbType.VarChar, modelUser.User_ID)} '下面的方法非常容易出错,因为并不是多有默认的参数都需要提供,但是不过缺少的话,就会出现错误了。 'Paramters = New SqlParameter() {New SqlParameter("@User_Pwd", SqlDbType.VarChar, modelUser.User_Pwd), New SqlParameter("@User_ID", SqlDbType.VarChar, modelUser.User_ID)} user_Pwd = sqlHelp.ExecuteProcedureScalar(spName, Paramters).ToString Catch ex As Exception Return Nothing MsgBox(ex.Message) End Try Return user_Pwd End Function ''' <summary> ''' 读取用户ID ''' </summary> ''' <param name="modelUser">用户实体类</param> ''' <returns>用户ID</returns> ''' <remarks></remarks> Public Function GetID(ByVal modelUser As Model.User) As String Implements IDAL.IUserDAL.GetID Dim User_ID As String Dim spName As String spName = "proc_GetUserID" Dim Paramters As SqlParameter() = Nothing Try Paramters = New SqlParameter() {Parame.Param("@User_ID", SqlDbType.VarChar, modelUser.User_ID)} User_ID = sqlHelp.ExecuteProcedureScalar(spName, Paramters).ToString Catch ex As Exception MsgBox(ex.Message) Return Nothing End Try Return User_ID End Function ''' <summary> ''' 读取用户身份级别 ''' </summary> ''' <param name="modelUser">用户实体类</param> ''' <returns>身份级别</returns> ''' <remarks></remarks> Public Function GetLevel(ByVal modelUser As Model.User) As String Implements IDAL.IUserDAL.GetLevel Dim User_Level As String Dim spName As String spName = "proc_GetUserLevel" Dim Paramters As SqlParameter() = Nothing Try Paramters = New SqlParameter() {Parame.Param("@User_ID", SqlDbType.VarChar, modelUser.User_ID)} User_Level = sqlHelp.ExecuteProcedureScalar(spName, Paramters).ToString Catch ex As Exception MsgBox(ex.Message) Return Nothing End Try Return User_Level End Function End Class
这里明显要比上一篇博客中的最原始的方法显得干净了好多。
另外据网上的一些说法认为:这种方法还有其他的一些好处,就是不必受集合索引的限制?但是我没有这样的理解,希望高手指点,可以参考下面的连接
http://caixiaodi51.blog.163.com/blog/static/139336285201011462415952/
相关文章推荐
- asp.net SqlParameter如何根据条件有选择的添加参数
- MyBatis传入参数为集合、数组SQL写法
- asp.net SqlParameter如何根据条件有选择的添加参数
- 向SqlParameter内动态添加参数
- mybatis中sql传入参数为集合、数组时解决方式
- asp.net SqlParameter 根据条件 有选择的添加参数
- SSM Mapper.xml 数组和集合作为 sql 语句 参数
- MyBatis传入参数为集合、数组SQL写法
- 向SqlParameter内动态添加参数
- 向SqlParameter内动态添加参数
- 数组作为参数传给存储过程(from:http://www.codeproject.com/KB/database/SQLArrayParameterHandling.aspx)
- sql参数数组,及调用。SqlParameter[] Parameters
- SqlParameter参数方式操作数据库(存储过程)
- 关于数组做函数参数的问题集合汇总
- MyBatis参数传入集合之foreach动态sql
- EXPLAIN sql优化方法1 添加索引
- 21、动态SQL之内置参数_parameter的使用
- SQLBindParameter 函数的参数解析及使用方法
- MyBatis参数传入集合之foreach动态sql
- MyBatis参数传入集合之foreach动态sql