使用工厂模式的通用数据访问组件 VB.NET






3.70/5 (12投票s)
2003年8月1日
4分钟阅读

71325
我刚刚阅读了 Mahesh 的文章《编写一个通用数据访问组件》。
引言
我刚刚阅读了 Mahesh 的文章 《编写一个通用数据访问组件》。
解决此问题的另一种方法是利用 System.Activator 类和工厂模式来创建具体的提供程序类,正如 Dan Fox 的文章“设计一个有效的数据访问体系结构”(.netmagazine, vol. 2, no. 7) 中所指出的那样。我采用了这个想法并对其进行了一些改进,这样,向工厂添加新提供程序的唯一步骤就是添加一个新的枚举以及工厂的静态类型数组中的关联类型值(总共 5 行代码)。
这是示例代码。有关测试应用程序,请参阅附带的源代码。
Imports System Imports System.Reflection Imports System.Data Imports System.Data.OleDb Imports System.Data.SqlClient Namespace CSharpCorner.ProviderFactory ' <summary> ' <see cref="ProviderFactory"/> 支持的 ADO.NET 数据提供程序集合。 ' </summary> Public Enum ProviderType ' <summary> ' OLE DB (<see cref="System.Data.OleDb"/>) .NET 数据提供程序。 ' </summary> OleDb = 0 ' <summary> ' SQL Server (<see cref="System.Data.SqlClient"/>) .NET 数据提供程序。 ' </summary> SqlClient End Enum 'ProviderType ' <summary> ' <b>ProviderFactory</b> 类通过创建方法抽象 ADO.NET 关系数据提供程序,这些方法返回 ' 底层 <see cref="System.Data"/> 接口。 ' </summary> ' <remarks> ' 此代码的灵感来源于 Dan Fox 的文章“设计一个有效的数据访问体系结构”(.netmagazine, vol. 2, no. 7) ' </remarks> Public Class ProviderFactory Private Shared _connectionTypes() As Type = {GetType(OleDbConnection), GetType(SqlConnection)} Private Shared _commandTypes() As Type = {GetType(OleDbCommand), GetType(SqlCommand)} ' Private Shared _dataAdapterTypes() As Type = {GetType(OleDbDataAdapter), GetType(SqlDataAdapter)} Private Shared _dataParameterTypes() As Type = {GetType(OleDbParameter), GetType(SqlParameter)} Private _provider As ProviderType Sub New() ' 强制用户指定提供程序 End Sub 'New Public Sub New(provider As ProviderType) ' End Sub 'New Property Provider() As ProviderType Get Return _provider End Get Set _provider = value End Set End Property Overloads Function CreateConnection() As IDbConnection Dim conn As IDbConnection = Nothing 试试 conn = CType(Activator.CreateInstance(_connectionTypes(CInt(_provider))), IDbConnection) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return conn End Function 'CreateConnection Overloads Public Function CreateConnection(connectionString As String) As IDbConnection Dim conn As IDbConnection = Nothing Dim args As Object() = connectionString 试试 conn = CType(Activator.CreateInstance(_connectionTypes(CInt(_provider)), args), IDbConnection) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return conn End Function 'CreateConnection Overloads Function CreateCommand() As IDbCommand Dim cmd As IDbCommand = Nothing 试试 cmd = CType(Activator.CreateInstance(_commandTypes(CInt(_provider))), IDbCommand) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return cmd End Function 'CreateCommand Overloads Public Function CreateCommand(cmdText As String) As IDbCommand Dim cmd As IDbCommand = Nothing Dim args As Object() = cmdText 试试 cmd = CType(Activator.CreateInstance(_commandTypes(CInt(_provider)), args), IDbCommand) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return cmd End Function 'CreateCommand Overloads Public Function CreateCommand(cmdText As String, connection As IDbConnection) As IDbCommand Dim cmd As IDbCommand = Nothing Dim args As Object() = {cmdText, connection} 试试 cmd = CType(Activator.CreateInstance(_commandTypes(CInt(_provider)), args), IDbCommand) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return cmd End Function 'CreateCommand Overloads Public Function CreateCommand(cmdText As String, connection As IDbConnection, transaction As IDbTransaction) As IDbCommand Dim cmd As IDbCommand = Nothing Dim args As Object() = {cmdText, connection, transaction} 试试 cmd = CType(Activator.CreateInstance(_commandTypes(CInt(_provider)), args), IDbCommand) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return cmd End Function 'CreateCommand Overloads Function CreateDataAdapter() As IDbDataAdapter Dim da As IDbDataAdapter = Nothing 试试 da = CType(Activator.CreateInstance(_dataAdapterTypes(CInt(_provider))), IDbDataAdapter) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return da End Function 'CreateDataAdapter Overloads Public Function CreateDataAdapter(selectCommand As IDbCommand) As IDbDataAdapter Dim da As IDbDataAdapter = Nothing Dim args As Object() = selectCommand 试试 da = CType(Activator.CreateInstance(_dataAdapterTypes(CInt(_provider)), args), IDbDataAdapter) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return da End Function 'CreateDataAdapter Overloads Public Function CreateDataAdapter(selectCommandText As String, selectConnection As IDbConnection) As IDbDataAdapter Dim da As IDbDataAdapter = Nothing Dim args As Object() = {selectCommandText, selectConnection} 试试 da = CType(Activator.CreateInstance(_dataAdapterTypes(CInt(_provider)), args), IDbDataAdapter) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return da End Function 'CreateDataAdapter Overloads Public Function CreateDataAdapter(selectCommandText As String, selectConnectionString As String) As IDbDataAdapter Dim da As IDbDataAdapter = Nothing Dim args As Object() = {selectCommandText, selectConnectionString} 试试 da = CType(Activator.CreateInstance(_dataAdapterTypes(CInt(_provider)), args), IDbDataAdapter) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return da End Function 'CreateDataAdapter Overloads Function CreateDataParameter() As IDbDataParameter Dim param As IDbDataParameter = Nothing 试试 param = CType(Activator.CreateInstance(_dataParameterTypes(CInt(_provider))), IDbDataParameter) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return param End Function 'CreateDataParameter Overloads Public Function CreateDataParameter(parameterName As String, value As Object) As IDbDataParameter Dim param As IDbDataParameter = Nothing Dim args As Object() = {parameterName, value} 试试 param = CType(Activator.CreateInstance(_dataParameterTypes(CInt(_provider)), args), IDbDataParameter) Catch e As TargetInvocationException Throw New SystemException(e.InnerException.Message, e.InnerException) End Try Return param End Function 'CreateDataParameter Overloads Public Function CreateDataParameter(parameterName As String, dataType As DbType) As IDbDataParameter Dim param As IDbDataParameter = CreateDataParameter() If Not (param Is Nothing) Then param.ParameterName = parameterName param.DbType = dataType End If Return param End Function 'CreateDataParameter Overloads Public Function CreateDataParameter(parameterName As String, dataType As DbType, size As Integer) As IDbDataParameter Dim param As IDbDataParameter = CreateDataParameter() If Not (param Is Nothing) Then param.ParameterName = parameterName param.DbType = dataType param.Size = size End If Return param End Function 'CreateDataParameter Overloads Public Function CreateDataParameter(parameterName As String, dataType As DbType, size As Integer, sourceColumn As String) As IDbDataParameter Dim param As IDbDataParameter = CreateDataParameter() If Not (param Is Nothing) Then param.ParameterName = parameterName param.DbType = dataType param.Size = size param.SourceColumn = sourceColumn End If Return param End Function 'CreateDataParameter End Class 'ProviderFactory ' End Namespace 'CSharpCorner.ProviderFactory |
关于作者 | ||
|