`

MySQL的SqlHelper类VB.NET版

    博客分类:
  • .NET
阅读更多

MySQL的SqlHelper类VB.NET版

这是偶根据SqlHelper类VB.NET版自己改的,没有完全测试。

版权信息应该不归我,希望微软不会找我。

使用该类需要加载MySQL.Data.dll文件。

使用示例:

        Dim sProc As String    '存储过程名变量
        Dim ds As New DataSet    '数据集变量

        sSQL = "SP_SELECT"    '存储过程名

        Dim para(1) As MySqlParameter    '存储过程参数数组变量,这里长度为2

        para(0) = New MySqlParameter("v_id", DbType.Int32)    '第一个参数
        para(1) = New MySqlParameter("v_password", DbType.String)    '第二个参数

        para(0).Value = 12    '赋值

        para(1).Value =  "123"    '赋值

        ds = BSHelper.ExecuteDataset(pubConst.sMySQLCon, CommandType.StoredProcedure, sProc , para)    '执行

 类代码:

'*********************************************************************

' Data Access Application Block for .NET

'

' BSHelper.cs

'

'*********************************************************************

'

'

'

'*********************************************************************

Imports System

Imports System.Data

'Imports System.Data.SqlClient

Imports MySql.Data

Imports MySql.Data.MySqlClient

Imports System.Collections

Namespace EnPaper.EnData

    '*********************************************************************

    '

    ' The BSHelper class=intended to encapsulate high performance, scalable best practices for

    ' common uses of MySqlClient.

    '

    '*********************************************************************

    Public NotInheritable Class BSHelper

        '*********************************************************************

        '

        ' Since this class provides only static methods, make the default constructor private to prevent

        ' instances from being created with "new BSHelper()".

        '

        '*********************************************************************

        Private Sub New()

        End Sub 'New

        '*********************************************************************

        '

        ' This method=used to attach array of MySqlParameters to a MySqlCommand.

        '

        ' 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 MySqlParameters tho be added to command

        '

        '*********************************************************************

        Private Shared Sub AttachParameters(ByVal command As MySqlCommand, ByVal commandParameters() As MySqlParameter)

            Dim p As MySqlParameter

            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 MySqlParameters.

        '

        ' param name="commandParameters" array of MySqlParameters to be assigned values

        ' param name="parameterValues" array of objects holding the values to be assigned

        '

        '*********************************************************************

        Private Shared Sub AssignParameterValues(ByVal commandParameters() As MySqlParameter, 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 MySqlParameters, 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 MySqlCommand to be prepared

        ' param name="connection" a valid MySqlConnection, on which to execute this command

        ' param name="transaction" a valid MySqlTransaction, 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 MySqlParameters to be associated with the command or 'null' if no parameters are required

        '

        '*********************************************************************

        Private Shared Sub PrepareCommand(ByVal command As MySqlCommand, ByVal connection As MySqlConnection, ByVal transaction As MySqlTransaction, ByVal commandType As CommandType, ByVal commandText As String, ByVal commandParameters() As MySqlParameter)

            '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 MySqlCommand (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 MySqlParameter("@prodid", 24));

        '

        ' param name="connectionString" a valid connection string for a MySqlConnection

        ' 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 MySqlParameter) As Integer

            'create & open a MySqlConnection, and dispose of it after we are done.

            Dim cn As New MySqlConnection(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 MySqlCommand (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 MySqlConnection

        ' 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 MySqlParameter() = MySqlHelperParameterCache.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 MySqlParameters

                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 MySqlCommand (that returns no resultset) against the specified MySqlConnection

        ' using the provided parameters.

        '

        ' e.g.: 

        '  int result = ExecuteNonQuery(conn, CommandType.StoredProcedure, "PublishOrders", new MySqlParameter("@prodid", 24));

        '

        ' param name="connection" a valid MySqlConnection

        ' 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 MySqlConnection, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As MySqlParameter) As Integer

            'create a command and prepare it for execution

            Dim cmd As New MySqlCommand

            PrepareCommand(cmd, connection, CType(Nothing, MySqlTransaction), commandType, commandText, commandParameters)

            'finally, execute the command.

            Dim retval As Integer = cmd.ExecuteNonQuery()

            ' detach the MySqlParameters from the command object, so they can be used again.

            cmd.Parameters.Clear()

            Return retval

        End Function 'ExecuteNonQuery

        '*********************************************************************

        '

        ' Execute a MySqlCommand (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 MySqlParameter("@prodid", 24));

        '

        ' param name="connectionString" a valid connection string for a MySqlConnection

        ' 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 MySqlParameter) As DataSet

            'create & open a MySqlConnection, and dispose of it after we are done.

            Dim cn As New MySqlConnection(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 MySqlCommand (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 MySqlConnection

        ' 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 MySqlParameter() = MySqlHelperParameterCache.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 MySqlParameters

                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 MySqlCommand (that returns a resultset) against the specified MySqlConnection

        ' using the provided parameters.

        '

        ' e.g.: 

        '  DataSet ds = ExecuteDataset(conn, CommandType.StoredProcedure, "GetOrders", new MySqlParameter("@prodid", 24));

        '

        ' param name="connection" a valid MySqlConnection

        ' 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 MySqlConnection, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As MySqlParameter) As DataSet

            'create a command and prepare it for execution

            Dim cmd As New MySqlCommand

            PrepareCommand(cmd, connection, CType(Nothing, MySqlTransaction), commandType, commandText, commandParameters)

            'create the DataAdapter & DataSet

            Dim da As New MySqlDataAdapter(cmd)

            Dim ds As New DataSet

            'fill the DataSet using default values for DataTable names, etc.

            da.Fill(ds)

            ' detach the MySqlParameters from the command object, so they can be used again.  

            cmd.Parameters.Clear()

            'return the dataset

            Return ds

        End Function 'ExecuteDataset

        '*********************************************************************

        '

        ' Execute a MySqlCommand (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 MySqlParameter("@prodid", 24));

        '

        ' param name="connectionString" a valid connection string for a MySqlConnection

        ' 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 MySqlParameter) As Object

            'create & open a MySqlConnection, and dispose of it after we are done.

            Dim cn As New MySqlConnection(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 MySqlCommand (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 MySqlConnection

        ' 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 MySqlParameter() = MySqlHelperParameterCache.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 MySqlParameters

                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 MySqlCommand (that returns a 1x1 resultset) against the specified MySqlConnection

        ' using the provided parameters.

        '

        ' e.g.: 

        '  int orderCount = (int)ExecuteScalar(conn, CommandType.StoredProcedure, "GetOrderCount", new MySqlParameter("@prodid", 24));

        '

        ' param name="connection" a valid MySqlConnection

        ' 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 MySqlConnection, ByVal commandType As CommandType, ByVal commandText As String, ByVal ParamArray commandParameters() As MySqlParameter) As Object

            'create a command and prepare it for execution

            Dim cmd As New MySqlCommand

            PrepareCommand(cmd, connection, CType(Nothing, MySqlTransaction), commandType, commandText, commandParameters)

            'execute the command & return the results

            Dim retval As Object = cmd.ExecuteScalar()

            ' detach the MySqlParameters from the command object, so they can be used again.

            cmd.Parameters.Clear()

            Return retval

        End Function 'ExecuteScalar

    End Class 'SqlHelper

    '*********************************************************************

    '

    ' MySqlHelperParameterCache 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 MySqlHelperParameterCache

        '*********************************************************************

        '

        ' Since this class provides only static methods, make the default constructor private to prevent

        ' instances from being created with "new MySqlHelperParameterCache()".

        '

        '*********************************************************************

        Private Sub New()

        End Sub 'New

        Private Shared paramCache As Hashtable = Hashtable.Synchronized(New Hashtable)

        '*********************************************************************

        '

        ' resolve at run time the appropriate set of MySqlParameters for a stored procedure

        '

        ' param name="connectionString" a valid connection string for a MySqlConnection

        ' 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 MySqlParameter()

            Dim cn As New MySqlConnection(connectionString)

            Try

                Dim cmd As New MySqlCommand(spName, cn)

                Try

                    cn.Open()

                    cmd.CommandType = CommandType.StoredProcedure

                    MySqlCommandBuilder.DeriveParameters(cmd)

                    If Not includeReturnValueParameter Then

                        cmd.Parameters.RemoveAt(0)

                    End If

                    Dim discoveredParameters(cmd.Parameters.Count) As MySqlParameter

                    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 MySqlParameter) As MySqlParameter()

            'deep copy of cached MySqlParameter array

            Dim clonedParameters(originalParameters.Length) As MySqlParameter

            Dim i, j As Integer

            j = originalParameters.Length

            For i = 0 To j

                clonedParameters(i) = CType(CType(originalParameters(i), ICloneable).Clone(), MySqlParameter)

            Next

            Return clonedParameters

        End Function 'CloneParameters

 

        '*********************************************************************

        '

        ' add parameter array to the cache

        '

        ' param name="connectionString" a valid connection string for a MySqlConnection

        ' 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 MySqlParameter)

            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 MySqlConnection

        ' 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 MySqlParameter()

            Dim hashKey As String = connectionString + ":" + commandText

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

            If cachedParameters Is Nothing Then

                Return Nothing

            Else

                Return CloneParameters(cachedParameters)

            End If

        End Function 'GetCachedParameterSet

        '*********************************************************************

        '

        ' Retrieves the set of MySqlParameters 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 MySqlConnection

        ' param name="spName" the name of the stored procedure

        ' returns an array of MySqlParameters

        '

        '*********************************************************************

        Public Overloads Shared Function GetSpParameterSet(ByVal connectionString As String, ByVal spName As String) As MySqlParameter()

            Return GetSpParameterSet(connectionString, spName, False)

        End Function 'GetSpParameterSet

        '*********************************************************************

        '

        ' Retrieves the set of MySqlParameters 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 MySqlConnection

        ' 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 MySqlParameters

        '

        '*********************************************************************

        Public Overloads Shared Function GetSpParameterSet(ByVal connectionString As String, ByVal spName As String, ByVal includeReturnValueParameter As Boolean) As MySqlParameter()

            Dim hashKey As String = connectionString + ":" + spName + IIf(includeReturnValueParameter, ":include ReturnValue Parameter", "")

            Dim cachedParameters() As MySqlParameter

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

            If cachedParameters Is Nothing Then

                paramCache(hashKey) = DiscoverSpParameterSet(connectionString, spName, includeReturnValueParameter)

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

            End If

            Return CloneParameters(cachedParameters)

        End Function   'GetSpParameterSet

    End Class 'MySqlHelperParameterCache

End Namespace ' EnPaper.EnData
 
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics