0

SQLHelper クラスを見ています: https://appsimplicity.googlecode.com/svn-history/r217/MetaDataExtractor/SchemaDiscovery/AppSimplicity.SchemaDiscovery.Providers/SQLServer/DataAccess/SQLHelper.vb

SQLHelper を使用して、Oracle データベースと SQL Server データベースに接続したいと考えています (選択は実行時に行われます)。

次の 2 つのオプションがあると思います。

  1. クラスではなくインターフェイスを使用するようにコードを修正します。たとえば、SQLCommand の代わりに dbCommand を使用します。
  2. executeReader などの一部の関数をオーバーロードして、Oracle 接続オブジェクトを受け入れる

車輪を再発明したくないので、他に代替オプションがないか探していました。代替オプションはありますか?代替オプションがない場合、どのオプションが最適ですか?

利用可能な他のデータ アクセス ソリューションについて説明している次の記事を読みました。

私が取り組んでいるプロジェクトは ADO.NET を使用しており、これが私が使用したい API です。

4

1 に答える 1

0

entlib5 データ ライブラリ全体とその依存関係を使用する必要なく、EntLib5 でそのパターンを模倣する 2 つのクラスを次に示します。2 つの呼び出し例では非クエリを使用していますが、スカラーとデータセット用の db メソッドがあります。また、データリーダー用に簡単に追加することもできます。

トランザクションでクラスを呼び出す例

 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
于 2012-11-29T16:13:39.867 に答える