数据访问包装器

时间:2012-11-29 15:09:28

标签: vb.net

我正在查看SQLHelper类:https://appsimplicity.googlecode.com/svn-history/r217/MetaDataExtractor/SchemaDiscovery/AppSimplicity.SchemaDiscovery.Providers/SQLServer/DataAccess/SQLHelper.vb

我想使用SQLHelper连接到Oracle数据库和SQL Server数据库(选择是在运行时进行的)。

我相信我有两个选择:

  1. 修改代码以使用接口而不是类,例如dbCommand而不是SQLCommand
  2. 超载一些功能,例如executeReader接受Oracle连接对象
  3. 我不想重新发明轮子,所以如果还有其他选择,我就会徘徊。还有其他选择吗?如果没有其他选择,那么哪个选项最好?

    我读过这篇文章,其中讨论了其他可用的数据访问解决方案:Is " SQL Helper Class " in Microsoft Application Blocks for .NET is excellent?

    我正在处理的项目使用ADO.NET,这是我想要使用的API。

1 个答案:

答案 0 :(得分:0)

以下是我使用的两个类,它们模仿EntLib5中的模式而无需使用整个entlib5数据库及其依赖项。这两个示例调用使用非查询,但有标量和数据集的db方法。你也可以很容易地为datareader添加一个。

使用交易调用类的示例

 Private Sub SubmitEntity(ByVal entity As Entity)

        Dim db As Database = DatabaseFactory.CreateDatabase()

        db.ConnectionString = Me.ConnectionString

        Dim transaction As SqlTransaction = Nothing

        Dim cmd As DbCommand = db.GetStoredProcCommand("dbo.MystoredProc")

        db.AddInParameter(cmd, "entityData", SqlDbType.VarChar, entity.Data)
        db.AddInParameter(cmd, "enitityId", SqlDbType.Int, DBNull.Value, ParameterDirection.Output)

        Try

            transaction = db.Transaction

            db.ExecuteNonQuery(cmd, db.Transaction)

            transaction.Commit()

            db.Dispose()

        Catch ex As Exception

            If transaction IsNot Nothing Then
                transaction.Rollback()
            End If

            If db IsNot Nothing AndAlso db.Connection IsNot Nothing Then
                db.Dispose()
            End If

        End Try

    End Sub

无交易调用示例

    Private Sub SubmitEntity(ByVal entity As Entity)

    Dim db As Database = DatabaseFactory.CreateDatabase("the connection string")

    Dim cmd As DbCommand = db.GetStoredProcCommand("dbo.MystoredProc")

    db.AddInParameter(cmd, "entityData", SqlDbType.VarChar, entity.Data)
    db.AddInParameter(cmd, "enitityId", SqlDbType.Int, DBNull.Value, ParameterDirection.Output)

    db.ExecuteNonQuery(cmd, db.Transaction)

End Sub

DatabaseFactory类

Imports System.Data.SqlClient

Friend Class DatabaseFactory

    Private Shared Property Connection As SqlConnection

    Friend Shared Function CreateDatabase(ByVal connectionString As String) As Database

        If Connection Is Nothing OrElse Connection.State <> ConnectionState.Open OrElse Connection.ConnectionString <> connectionString Then

            'create a new SqlConnection, and assign the connection string property
            Connection = New SqlConnection With
                {
                    .ConnectionString = connectionString
                }

            'connect to the Sql database
            Connection.Open()

        End If

        'return the database with an open connection
        Return New Database With {.Connection = Connection, .ConnectionString = connectionString}

    End Function

    Friend Shared Function CreateDatabase() As Database

        Return New Database

    End Function

End Class

数据库类

Imports System.Data.SqlClient

Friend Class Database

    Friend Property ConnectionString As String

    Private ConnectionValue As SqlConnection
    Friend Property Connection As SqlConnection
        Get
            If Me.ConnectionValue Is Nothing OrElse Me.ConnectionValue.State <> ConnectionState.Open Then
                If Not String.IsNullOrWhiteSpace(Me.ConnectionString) Then
                    'create a new SqlConnection, and assign the connection string property
                    Me.ConnectionValue = New SqlConnection With
                        {
                            .ConnectionString = ConnectionString
                        }

                    'connect to the Sql database
                    Me.ConnectionValue.Open()
                Else
                    Throw New Exception("A connection string must be provided.")
                End If
            End If
            Return Me.ConnectionValue
        End Get
        Set(ByVal value As SqlConnection)
            Me.ConnectionValue = value
        End Set
    End Property

    Private TransactionValue As SqlTransaction
    Friend Property Transaction As SqlTransaction
        Get
            If TransactionValue Is Nothing Then
                If Me.Connection IsNot Nothing Then
                    Me.TransactionValue = Me.Connection.BeginTransaction
                Else
                    Throw New Exception("No open connection exists.")
                End If
            End If
            Return Me.TransactionValue
        End Get
        Set(ByVal value As SqlTransaction)
            Me.TransactionValue = value
        End Set
    End Property

    Friend Function GetStoredProcCommand(ByVal storedProcName As String) As SqlCommand

        Dim cmd As New SqlCommand() With
            {
                .CommandText = storedProcName,
                .CommandType = CommandType.StoredProcedure,
                .Connection = Me.Connection
            }

        Return cmd

    End Function

    Friend Function GetSqlStringCommand(ByVal query As String) As SqlCommand

        Dim cmd As New SqlCommand() With
            {
                .CommandText = query,
                .CommandType = CommandType.Text,
                .Connection = Me.Connection
            }

        Return cmd

    End Function

    Friend Sub AddInParameter(ByRef cmd As SqlCommand, ByVal paramterName As String, ByVal sqlDbType As SqlDbType, ByVal value As Object, Optional ByVal direction As ParameterDirection = ParameterDirection.Input)

        Dim para As New SqlParameter With
            {
                .Value = value,
                .ParameterName = If(Not paramterName.StartsWith("@"), String.Format("@{0}", paramterName), paramterName),
                .SqlDbType = sqlDbType,
                .Direction = direction
            }

        cmd.Parameters.Add(para)

    End Sub

    Friend Sub ExecuteNonQuery(ByVal cmd As SqlCommand, ByVal transaction As SqlTransaction)

        cmd.Transaction = transaction

        cmd.ExecuteNonQuery()

    End Sub

    Friend Sub ExecuteNonQuery(ByVal cmd As SqlCommand)

        cmd.ExecuteNonQuery()

    End Sub

    Friend Function ExecuteScalar(ByVal cmd As SqlCommand, ByVal transaction As SqlTransaction) As Object

        cmd.Transaction = transaction

        Return cmd.ExecuteScalar()

    End Function

    Friend Function ExecuteScalar(ByVal cmd As SqlCommand) As Object

        Return cmd.ExecuteScalar()

    End Function

    Friend Function ExecuteDataSet(ByVal cmd As SqlCommand, ByVal transaction As SqlTransaction) As DataSet

        cmd.Transaction = transaction

        Dim adapter As New SqlDataAdapter
        adapter.SelectCommand = cmd

        Dim dSet As New DataSet

        adapter.Fill(dSet)

        adapter.Dispose()

        Return dSet

    End Function

    Friend Function ExecuteDataSet(ByVal cmd As SqlCommand) As DataSet

        Dim adapter As New SqlDataAdapter
        adapter.SelectCommand = cmd

        Dim dSet As New DataSet

        adapter.Fill(dSet)

        adapter.Dispose()

        Return dSet

    End Function

    Friend Sub Dispose()
        Me.Connection.Close()
        Me.Connection.Dispose()
    End Sub


End Class