您的位置:首页 > 数据库

向SqlParameter集合数组中添加参数——SQLHelp对数据访问层的优化(一)

2012-01-03 17:28 495 查看
这是今天下午忙活半天的成果,但不管怎样吧还是达到了想要的目的:通过集合数据自动添加SqlParameter参数到Command命令中。

思路很明确,也很简单,大致的可以分两步。

第一步,将用户输入的存储过程参数写入到一个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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: