SqlHelper类VB.NET版


Imports System.Data
Imports System.Data.SqlClient
Imports System.Configuration
Imports System.Collections
Public MustInherit Class SqlHelper
          ''' <summary>
          ''' 哈希表:缓存参数
          ''' </summary>
          ''' <remarks></remarks>
          Public Shared parmCache As Hashtable = Hashtable.Synchronized(New Hashtable())
          ''' <summary>
          '''
          ''' </summary>
          ''' <param name="connectionString"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="commandParameters">ParamArray 表示函数参数个数不确定C#中为params</param>
          ''' <returns></returns>
          ''' <remarks></remarks>
          Public Shared Function ExecuteNonquery(ByVal connectionString As String, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal ParamArray commandParameters As SqlParameter()) As Int32
              Dim cmd As SqlCommand = New SqlCommand
              Using conn As SqlConnection = New SqlConnection(connectionString)
                  PrepareCommand(cmd, conn, Nothing, cmdType, cmdText, commandParameters)
                  Dim val As Int32 = cmd.ExecuteNonQuery()
                  cmd.Parameters.Clear()
                  Return val
              End Using
          End Function
          ''' <summary>
          '''
          ''' </summary>
          ''' <param name="connection"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="commandParameters">ParamArray 表示函数参数个数不确定C#中为params</param>
          ''' <returns></returns>
          ''' <remarks></remarks>
          Public Shared Function ExecuteNonQuery(ByVal connection As SqlConnection, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal ParamArray commandParameters As SqlParameter()) As Int32
              Dim cmd As SqlCommand = New SqlCommand
              PrepareCommand(cmd, connection, Nothing, cmdType, cmdText, commandParameters)
              Dim val As Int32 = cmd.ExecuteNonQuery()
              cmd.Parameters.Clear()
              Return val
          End Function
          ''' <summary>
          '''
          ''' </summary>
          ''' <param name="trans"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="commandParameters">ParamArray 表示函数参数个数不确定C#中为params</param>
          ''' <returns></returns>
          ''' <remarks></remarks>
          Public Shared Function ExecuteNonQuery(ByVal trans As SqlTransaction, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal ParamArray commandParameters As SqlParameter()) As Int32
              Dim cmd As SqlCommand = New SqlCommand
              PrepareCommand(cmd, trans.Connection, trans, cmdType, cmdText, commandParameters)
              Dim val As Int32 = cmd.ExecuteNonQuery()
              cmd.Parameters.Clear()
              Return val
          End Function
          ''' <summary>
          ''' 返回数据集,可以包含多个表,这是我自己加上的,用以返回数据集,表
          ''' </summary>
          ''' <param name="connectionString"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="commandParameters"></param>
          ''' <returns></returns>
          ''' <remarks></remarks>
          Public Shared Function ExecuteDataSet(ByVal connectionString As String, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal ParamArray commandParameters As SqlParameter()) As DataSet
              Dim cmd As SqlCommand = New SqlCommand
              Using conn As SqlConnection = New SqlConnection(connectionString)
                  PrepareCommand(cmd, conn, Nothing, cmdType, cmdText, commandParameters)
                  Dim adp As SqlDataAdapter = New SqlDataAdapter(cmd)
                  Dim ds As DataSet = New DataSet
                  Try
                      adp.Fill(ds)
                      cmd.Parameters.Clear()
                  Finally
                      adp.Dispose()
                  End Try
                  Return ds
              End Using
          End Function
          ''' <summary>
          '''
          ''' </summary>
          ''' <param name="connectionString"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="commandParameters">ParamArray 表示函数参数个数不确定C#中为params</param>
          ''' <returns></returns>
          ''' <remarks></remarks>
          Public Shared Function ExecuteReader(ByVal connectionString As String, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal ParamArray commandParameters As SqlParameter()) As SqlDataReader
              Dim cmd As SqlCommand = New SqlCommand
              Dim conn As SqlConnection = New SqlConnection(connectionString)
              Try
                  PrepareCommand(cmd, conn, Nothing, cmdType, cmdText, commandParameters)
                  Dim rdr As SqlDataReader = cmd.ExecuteReader(CommandBehavior.CloseConnection)
                  cmd.Parameters.Clear()
                  Return rdr
              Catch ex As Exception
                  conn.Close()
                  Throw
              End Try
          End Function
          ''' <summary>
          '''
          ''' </summary>
          ''' <param name="connectionString"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="commandParameters">ParamArray 表示函数参数个数不确定C#中为params</param>
          ''' <returns></returns>
          ''' <remarks></remarks>
          Public Shared Function ExecuteScalar(ByVal connectionString As String, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal ParamArray commandParameters As SqlParameter()) As Object
              Dim cmd As SqlCommand = New SqlCommand
              Using connection As SqlConnection = New SqlConnection(connectionString)
                  PrepareCommand(cmd, connection, Nothing, cmdType, cmdText, commandParameters)
                  Dim val As Object = cmd.ExecuteScalar()
                  cmd.Parameters.Clear()
                  Return val
              End Using
          End Function
          ''' <summary>
          '''
          ''' </summary>
          ''' <param name="connection"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="commandParameters">ParamArray 表示函数参数个数不确定C#中为params</param>
          ''' <returns></returns>
          ''' <remarks></remarks>
          Public Shared Function ExecuteScalar(ByVal connection As SqlConnection, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal ParamArray commandParameters As SqlParameter()) As Object
              Dim cmd As SqlCommand = New SqlCommand
              PrepareCommand(cmd, connection, Nothing, cmdType, cmdText, commandParameters)
              Dim val As Object = cmd.ExecuteScalar()
              cmd.Parameters.Clear()
              Return val
          End Function
          ''' <summary>
          ''' add parameter array to the cache
          ''' </summary>
          ''' <param name="cacheKey"></param>
          ''' <param name="commandParameters">an array of SqlParamters to be cached</param>
          ''' <remarks></remarks>
          Public Shared Sub CacheParameters(ByVal cacheKey As String, ByVal ParamArray commandParameters As SqlParameter())
              parmCache(cacheKey) = commandParameters
          End Sub

          Public Shared Function GetCachedParameters(ByVal cacheKey As String) As SqlParameter()
              Dim cachedParms As SqlParameter() = CType(parmCache(cacheKey), SqlParameter())
              If cachedParms Is Nothing Then Return Nothing
              Dim clonedParms(cachedParms.Length - 1) As SqlParameter
              Dim i As Integer
              For i = 0 To cachedParms.Length - 1
                  clonedParms(i) = CType(CType(cachedParms(i), ICloneable).Clone(), SqlParameter)
              Next
              Return clonedParms
          End Function
          ''' <summary>
          '''
          ''' </summary>
          ''' <param name="cmd"></param>
          ''' <param name="conn"></param>
          ''' <param name="trans"></param>
          ''' <param name="cmdType"></param>
          ''' <param name="cmdText"></param>
          ''' <param name="cmdParms"></param>
          ''' <remarks></remarks>
          Private Shared Sub PrepareCommand(ByVal cmd As SqlCommand, ByVal conn As SqlConnection, ByVal trans As SqlTransaction, ByVal cmdType As CommandType, ByVal cmdText As String, ByVal cmdParms As SqlParameter())
              If conn.State <> ConnectionState.Open Then conn.Open()
              cmd.Connection = conn
              cmd.CommandText = cmdText
              If trans IsNot Nothing Then cmd.Transaction = trans
              cmd.CommandType = cmdType
              If cmdParms IsNot Nothing Then
                  Dim parm As SqlParameter
                  For Each parm In cmdParms
                      cmd.Parameters.Add(parm)
                  Next
              End If
          End Sub
      End Class

 

 

第二种:

 

'*********************************************************************
' Microsoft Data Access Application Block for .NET
' http://msdn.microsoft.com/library/en-us/dnbda/html/daab-rm.asp
'
' SQLHelper.cs
'
' This file contains the implementations of the SqlHelper and SqlHelperParameterCache
' classes.
'
' For more information see the Data Access Application Block Implementation Overview.
'
'*********************************************************************
' Copyright (C) 2000-2001 Microsoft Corporation
' All rights reserved.
' THIS CODE AND INFORMATION=PROVIDED "AS IS" WITHOUT WARRANTY
' OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT
' LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR
' FITNESS FOR A PARTICULAR PURPOSE.
'*********************************************************************
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.Collections


Namespace EnPaper.EnData

    '*********************************************************************
    '
    ' The SqlHelper class=intended to encapsulate high performance, scalable best practices for
    ' common uses of SqlClient.
    '
    '*********************************************************************

    Public NotInheritable Class SqlHelper

        '*********************************************************************
        '
        ' Since this class provides only static methods, make the default constructor private to prevent
        ' instances from being created with "new SqlHelper()".
        '
        '*********************************************************************
        Private Sub New()
        End Sub 'New

        '*********************************************************************
        '
        ' This method=used to attach array of SqlParameters to a SqlCommand.
        '
        ' This method will assign a value of DbNull to any parameter with a direction of
        ' InputOutput and a value of null. 
        '
        ' This behavior will prevent default values from being used, but
        ' this will be the less common case than an intended pure output parameter (derived as InputOutput)
        ' where the user provided no input value.
        '
        ' param name="command" The command to which the parameters will be added
        ' param name="commandParameters" an array of SqlParameters tho be added to command
        '
        '*********************************************************************
        Private Shared Sub AttachParameters(ByVal command As SqlCommand, ByVal commandParameters() As SqlParameter)
            Dim p As SqlParameter
            For Each p In commandParameters
                'check for derived output value with no value assigned
                If p.Direction = ParameterDirection.InputOutput AndAlso p.Value Is Nothing Then
                    p.Value = DBNull.Value
                End If
                command.Parameters.Add(p)
            Next p
        End Sub 'AttachParameters


        '*********************************************************************
        '
        ' This method assigns an array of values to an array of SqlParameters.
        '
        ' param name="commandParameters" array of SqlParameters to be assigned values
        ' param name="parameterValues" array of objects holding the values to be assigned
        '
        '*********************************************************************
        Private Shared Sub AssignParameterValues(ByVal commandParameters() As SqlParameter, ByVal parameterValues() As Object)
            If commandParameters Is Nothing OrElse parameterValues Is Nothing Then
                'do nothing if we get no data
                Return
            End If

            If commandParameters.Length <> parameterValues.Length Then
                Throw New ArgumentException("Parameter count does not match Parameter Value count.")
            End If

            Dim i, j As Integer
            j = commandParameters.Length
            For i = 0 To j
                commandParameters(i).Value = parameterValues(i)
            Next
        End Sub 'AssignParameterValues

        'iterate through the SqlParameters, assigning the values from the corresponding position in the
        'value array

        '*********************************************************************
        '
        ' This method opens (if necessary) and assigns a connection, transaction, command type and parameters
        ' to the provided command.
        '
        ' param name="command" the SqlCommand to be prepared
        ' param name="connection" a valid SqlConnection, on which to execute this command
        ' param name="transaction" a valid SqlTransaction, or 'null'
        ' param name="commandType" the CommandType (stored procedure, text, etc.)
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParameters to be associated with the command or 'null' if no parameters are required
        '
        '*********************************************************************
        Private Shared Sub PrepareCommand(ByVal command As SqlCommand, ByVal connection As SqlConnection, ByVal transaction As SqlTransaction, ByVal commandType As CommandType, ByVal commandText As String, ByVal commandParameters() As SqlParameter)
            'if the provided connection=not open, we will open it
            If connection.State <> ConnectionState.Open Then
                connection.Open()
            End If

            'associate the connection with the command
            command.Connection = connection

            'set the command text (stored procedure name or SQL statement)
            command.CommandText = commandText

            'if we were provided a transaction, assign it.
            If Not (transaction Is Nothing) Then
                command.Transaction = transaction
            End If

            'set the command type
            command.CommandType = commandType

            'attach the command parameters if they are provided
            If Not (commandParameters Is Nothing) Then
                AttachParameters(command, commandParameters)
            End If

            Return
        End Sub 'PrepareCommand


        '*********************************************************************
        '
        ' Execute a SqlCommand (that returns no resultset) against the database specified in the connection string
        ' using the provided parameters.
        '
        ' e.g.: 
        '  int result = ExecuteNonQuery(connString, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="commandType" the CommandType (stored procedure, text, etc.)
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParamters used to execute the command
        ' returns an int representing the number of rows affected by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteNonQuery(ByVal connectionString As String, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As SqlParameter) As Integer
            'create & open a SqlConnection, and dispose of it after we are done.
            Dim cn As New SqlConnection(connectionString)
            Try
                cn.Open()

                'call the overload that takes a connection in place of the connection string
                Return ExecuteNonQuery(cn, commandType, commandText, commandParameters)
            Finally
                cn.Dispose()
            End Try
        End Function 'ExecuteNonQuery


        '*********************************************************************
        '
        ' Execute a stored procedure via a SqlCommand (that returns no resultset) against the database specified in
        ' the connection string using the provided parameter values.  This method will query the database to discover the parameters for the
        ' stored procedure (the first time each stored procedure=called), and assign the values based on parameter order.
        '
        ' This method provides no access to output parameters or the stored procedure's return value parameter.
        '
        ' e.g.: 
        '  int result = ExecuteNonQuery(connString, "PublishOrders", 24, 36);
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="spName" the name of the stored prcedure
        ' param name="parameterValues" an array of objects to be assigned as the input values of the stored procedure
        ' returns an int representing the number of rows affected by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteNonQuery(ByVal connectionString As String, ByVal spName As String, ByVal ParamArray parameterValues() As Object) As Integer
            'if we receive parameter values, we need to figure out where they go
            If Not (parameterValues Is Nothing) AndAlso parameterValues.Length > 0 Then
                'pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
                Dim commandParameters As SqlParameter() = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName)

                'assign the provided values to these parameters based on parameter order
                AssignParameterValues(commandParameters, parameterValues)

                'call the overload that takes an array of SqlParameters
                Return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName, commandParameters)
                'otherwise we can just call the SP without params
            Else
                Return ExecuteNonQuery(connectionString, CommandType.StoredProcedure, spName)
            End If
        End Function 'ExecuteNonQuery


        '*********************************************************************
        '
        ' Execute a SqlCommand (that returns no resultset) against the specified SqlConnection
        ' using the provided parameters.
        '
        ' e.g.: 
        '  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new SqlParameter("@prodid", 24));
        '
        ' param name="connection" a valid SqlConnection
        ' param name="commandType" the CommandType (stored procedure, text, etc.)
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParamters used to execute the command
        ' returns an int representing the number of rows affected by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteNonQuery(ByVal connection As SqlConnection, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As SqlParameter) As Integer
            'create a command and prepare it for execution
            Dim cmd As New SqlCommand
            PrepareCommand(cmd, connection, CType(Nothing, SqlTransaction), commandType, commandText, commandParameters)

            'finally, execute the command.
            Dim retval As Integer = cmd.ExecuteNonQuery()

            ' detach the SqlParameters from the command object, so they can be used again.
            cmd.Parameters.Clear()
            Return retval
        End Function 'ExecuteNonQuery


        '*********************************************************************
        '
        ' Execute a SqlCommand (that returns a resultset) against the database specified in the connection string
        ' using the provided parameters.
        '
        ' e.g.: 
        '  DataSet ds = ExecuteDataset(connString, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="commandType" the CommandType (stored procedure, text, etc.)
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParamters used to execute the command
        ' returns a dataset containing the resultset generated by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteDataset(ByVal connectionString As String, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As SqlParameter) As DataSet
            'create & open a SqlConnection, and dispose of it after we are done.
            Dim cn As New SqlConnection(connectionString)
            Try
                cn.Open()

                'call the overload that takes a connection in place of the connection string
                Return ExecuteDataset(cn, commandType, commandText, commandParameters)
            Finally
                cn.Dispose()
            End Try
        End Function 'ExecuteDataset


        '*********************************************************************
        '
        ' Execute a stored procedure via a SqlCommand (that returns a resultset) against the database specified in
        ' the connection string using the provided parameter values.  This method will query the database to discover the parameters for the
        ' stored procedure (the first time each stored procedure=called), and assign the values based on parameter order.
        '
        ' This method provides no access to output parameters or the stored procedure's return value parameter.
        '
        ' e.g.: 
        '  DataSet ds = ExecuteDataset(connString, "GetOrders", 24, 36);
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="spName" the name of the stored procedure
        ' param name="parameterValues" an array of objects to be assigned as the input values of the stored procedure
        ' returns a dataset containing the resultset generated by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteDataset(ByVal connectionString As String, ByVal spName As String, ByVal ParamArray parameterValues() As Object) As DataSet
            'if we receive parameter values, we need to figure out where they go
            If Not (parameterValues Is Nothing) AndAlso parameterValues.Length > 0 Then
                'pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
                Dim commandParameters As SqlParameter() = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName)

                'assign the provided values to these parameters based on parameter order
                AssignParameterValues(commandParameters, parameterValues)

                'call the overload that takes an array of SqlParameters
                Return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName, commandParameters)
                'otherwise we can just call the SP without params
            Else
                Return ExecuteDataset(connectionString, CommandType.StoredProcedure, spName)
            End If
        End Function 'ExecuteDataset


        '*********************************************************************
        '
        ' Execute a SqlCommand (that returns a resultset) against the specified SqlConnection
        ' using the provided parameters.
        '
        ' e.g.: 
        '  DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new SqlParameter("@prodid", 24));
        '
        ' param name="connection" a valid SqlConnection
        ' param name="commandType" the CommandType (stored procedure, text, etc.)
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParamters used to execute the command
        ' returns a dataset containing the resultset generated by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteDataset(ByVal connection As SqlConnection, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As SqlParameter) As DataSet
            'create a command and prepare it for execution
            Dim cmd As New SqlCommand
            PrepareCommand(cmd, connection, CType(Nothing, SqlTransaction), commandType, commandText, commandParameters)

            'create the DataAdapter & DataSet
            Dim da As New SqlDataAdapter(cmd)
            Dim ds As New DataSet

            'fill the DataSet using default values for DataTable names, etc.
            da.Fill(ds)

            ' detach the SqlParameters from the command object, so they can be used again.   
            cmd.Parameters.Clear()

            'return the dataset
            Return ds
        End Function 'ExecuteDataset


        '*********************************************************************
        '
        ' Execute a SqlCommand (that returns a 1x1 resultset) against the database specified in the connection string
        ' using the provided parameters.
        '
        ' e.g.: 
        '  int orderCount = (int)ExecuteScalar(connString, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="commandType" the CommandType (stored procedure, text, etc.)
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParamters used to execute the command
        ' returns an object containing the value in the 1x1 resultset generated by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteScalar(ByVal connectionString As String, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As SqlParameter) As Object
            'create & open a SqlConnection, and dispose of it after we are done.
            Dim cn As New SqlConnection(connectionString)
            Try
                cn.Open()

                'call the overload that takes a connection in place of the connection string
                Return ExecuteScalar(cn, commandType, commandText, commandParameters)
            Finally
                cn.Dispose()
            End Try
        End Function 'ExecuteScalar


        '*********************************************************************
        '
        ' Execute a stored procedure via a SqlCommand (that returns a 1x1 resultset) against the database specified in
        ' the connection string using the provided parameter values.  This method will query the database to discover the parameters for the
        ' stored procedure (the first time each stored procedure=called), and assign the values based on parameter order.
        '
        ' This method provides no access to output parameters or the stored procedure's return value parameter.
        '
        ' e.g.: 
        '  int orderCount = (int)ExecuteScalar(connString, "GetOrderCount", 24, 36);
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="spName" the name of the stored procedure
        ' param name="parameterValues" an array of objects to be assigned as the input values of the stored procedure
        ' returns an object containing the value in the 1x1 resultset generated by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteScalar(ByVal connectionString As String, ByVal spName As String, ByVal ParamArray parameterValues() As Object) As Object
            'if we receive parameter values, we need to figure out where they go
            If Not (parameterValues Is Nothing) AndAlso parameterValues.Length > 0 Then
                'pull the parameters for this stored procedure from the parameter cache (or discover them & populate the cache)
                Dim commandParameters As SqlParameter() = SqlHelperParameterCache.GetSpParameterSet(connectionString, spName)

                'assign the provided values to these parameters based on parameter order
                AssignParameterValues(commandParameters, parameterValues)

                'call the overload that takes an array of SqlParameters
                Return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName, commandParameters)
                'otherwise we can just call the SP without params
            Else
                Return ExecuteScalar(connectionString, CommandType.StoredProcedure, spName)
            End If
        End Function 'ExecuteScalar


        '*********************************************************************
        '
        ' Execute a SqlCommand (that returns a 1x1 resultset) against the specified SqlConnection
        ' using the provided parameters.
        '
        ' e.g.: 
        '  int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new SqlParameter("@prodid", 24));
        '
        ' param name="connection" a valid SqlConnection
        ' param name="commandType" the CommandType (stored procedure, text, etc.)
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParamters used to execute the command
        ' returns an object containing the value in the 1x1 resultset generated by the command
        '
        '*********************************************************************
        Public Overloads Shared Function ExecuteScalar(ByVal connection As SqlConnection, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As SqlParameter) As Object
            'create a command and prepare it for execution
            Dim cmd As New SqlCommand
            PrepareCommand(cmd, connection, CType(Nothing, SqlTransaction), commandType, commandText, commandParameters)

            'execute the command & return the results
            Dim retval As Object = cmd.ExecuteScalar()

            ' detach the SqlParameters from the command object, so they can be used again.
            cmd.Parameters.Clear()
            Return retval
        End Function 'ExecuteScalar

    End Class 'SqlHelper

    '*********************************************************************
    '
    ' SqlHelperParameterCache provides functions to leverage a static cache of procedure parameters, and the
    ' ability to discover parameters for stored procedures at run-time.
    '
    '*********************************************************************

    Public NotInheritable Class SqlHelperParameterCache

        '*********************************************************************
        '
        ' Since this class provides only static methods, make the default constructor private to prevent
        ' instances from being created with "new SqlHelperParameterCache()".
        '
        '*********************************************************************
        Private Sub New()
        End Sub 'New
        Private Shared paramCache As Hashtable = Hashtable.Synchronized(New Hashtable)


        '*********************************************************************
        '
        ' resolve at run time the appropriate set of SqlParameters for a stored procedure
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="spName" the name of the stored procedure
        ' param name="includeReturnValueParameter" whether or not to include their return value parameter
        '
        '*********************************************************************
        Private Shared Function DiscoverSpParameterSet(ByVal connectionString As String, ByVal spName As String, ByVal includeReturnValueParameter As Boolean) As SqlParameter()
            Dim cn As New SqlConnection(connectionString)
            Try
                Dim cmd As New SqlCommand(spName, cn)
                Try
                    cn.Open()
                    cmd.CommandType = CommandType.StoredProcedure

                    SqlCommandBuilder.DeriveParameters(cmd)

                    If Not includeReturnValueParameter Then
                        cmd.Parameters.RemoveAt(0)
                    End If

                    Dim discoveredParameters(cmd.Parameters.Count) As SqlParameter

                    cmd.Parameters.CopyTo(discoveredParameters, 0)

                    Return discoveredParameters
                Finally
                    cmd.Dispose()
                End Try
            Finally
                cn.Dispose()
            End Try
        End Function 'DiscoverSpParameterSet

        Private Shared Function CloneParameters(ByVal originalParameters() As SqlParameter) As SqlParameter()
            'deep copy of cached SqlParameter array
            Dim clonedParameters(originalParameters.Length) As SqlParameter
            Dim i, j As Integer
            j = originalParameters.Length
            For i = 0 To j
                clonedParameters(i) = CType(CType(originalParameters(i), ICloneable).Clone(), SqlParameter)
            Next
            Return clonedParameters
        End Function 'CloneParameters

        '*********************************************************************
        '
        ' add parameter array to the cache
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="commandText" the stored procedure name or T-SQL command
        ' param name="commandParameters" an array of SqlParamters to be cached
        '
        '*********************************************************************
        Public Shared Sub CacheParameterSet(ByVal connectionString As String, ByVal commandText As String, ByVal ParamArray commandParameters() As SqlParameter)
            Dim hashKey As String = connectionString + ":" + commandText

            paramCache(hashKey) = commandParameters
        End Sub 'CacheParameterSet


        '*********************************************************************
        '
        ' Retrieve a parameter array from the cache
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="commandText" the stored procedure name or T-SQL command
        ' returns an array of SqlParamters
        '
        '*********************************************************************
        Public Shared Function GetCachedParameterSet(ByVal connectionString As String, ByVal commandText As String) As SqlParameter()
            Dim hashKey As String = connectionString + ":" + commandText

            Dim cachedParameters As SqlParameter() = CType(paramCache(hashKey), SqlParameter())

            If cachedParameters Is Nothing Then
                Return Nothing
            Else
                Return CloneParameters(cachedParameters)
            End If
        End Function 'GetCachedParameterSet


        '*********************************************************************
        '
        ' Retrieves the set of SqlParameters appropriate for the stored procedure
        '
        ' This method will query the database for this information, and then store it in a cache for future requests.
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="spName" the name of the stored procedure
        ' returns an array of SqlParameters
        '
        '*********************************************************************
        Public Overloads Shared Function GetSpParameterSet(ByVal connectionString As String, ByVal spName As String) As SqlParameter()
            Return GetSpParameterSet(connectionString, spName, False)
        End Function 'GetSpParameterSet


        '*********************************************************************
        '
        ' Retrieves the set of SqlParameters appropriate for the stored procedure
        '
        ' This method will query the database for this information, and then store it in a cache for future requests.
        '
        ' param name="connectionString" a valid connection string for a SqlConnection
        ' param name="spName" the name of the stored procedure
        ' param name="includeReturnValueParameter" a bool value indicating whether the return value parameter should be included in the results
        ' returns an array of SqlParameters
        '
        '*********************************************************************
        Public Overloads Shared Function GetSpParameterSet(ByVal connectionString As String, ByVal spName As String, ByVal includeReturnValueParameter As Boolean) As SqlParameter()
            Dim hashKey As String = connectionString + ":" + spName + IIf(includeReturnValueParameter, ":include ReturnValue Parameter", "")

            Dim cachedParameters() As SqlParameter

            cachedParameters = CType(paramCache(hashKey), SqlParameter())

            If cachedParameters Is Nothing Then
                paramCache(hashKey) = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)
                cachedParameters = CType(paramCache(hashKey), SqlParameter())
            End If

            Return CloneParameters(cachedParameters)
        End Function   'GetSpParameterSet

    End Class 'SqlHelperParameterCache

End Namespace ' EnPaper.EnData

你可能感兴趣的:(SqlHelper类VB.NET版)