设计决策:(VB.NET)我应该创建一个类或模块来轻松连接到多个数据库之一吗?

2024-04-04

基本上,我们有三个数据库可以从中获取数据。一种是 SQL Server 数据库,一种是 Access 数据库(连接起来特别烦人,因为我们必须映射网络驱动器等),最后一个将是 Oracle 数据库(当 IT 最终授予我们权限时)。

我正在考虑创建一个辅助函数,使查询这些数据库中的任何一个尽可能容易。理想情况下,我想创建一个二维数组

Dim myEasyResultArray(10,10) as String
myEasyResultArray = DatabaseHelper("Access", "SELECT * FROM Employee")

这是一个好的设计决策吗?另外,如何才能使数组的大小合适?我可以只做这个吗?

Dim myEasyResultArray = DatabaseHelper("Access", "SELECT * FROM Employee")

这应该是一个模块还是一个类?我真的不需要共享变量,


我会尝试将所有数据访问逻辑放入数据访问层。理想情况下,这应该位于单独的库和命名空间中,但并非必须如此。我会使用类,通常每个表/实体一个,并将所有类设计为无状态的(因此您不必重复使用数据访问对象的同一实例,您可以在需要时随时实例化一个新的类)访问数据库)。

我不想让它返回数组,而是让它返回数据对象(通常称为 DTO - 数据传输对象)。如果可能的话,我会保持 DTO 类尽可能干净,仅包含公共属性而不包含方法。数据访问类应该全部实现接口,以便可以创建每个数据访问类的多个版本。一个用于 Access,一个用于 Oracle,一个用于 SQL,等等。然后,无论我需要访问数据库的任何地方(希望仅在我的业务层中,而不是在我的 UI 层中),我都会通过它们的“ generic”接口类型(因此需要工厂类将正确的具体数据访问对象类型注入到我的业务对象中)。

这是 DTO 的一个真实简单的示例:

Public Class Employee
    Public Id As Guid
    Public Name As String
    Public StartDate As Date
End Class

这是一个数据访问接口示例

Public Interface IEmployeeDataAccess
    Function GetEmployee(id As Guid) As Employee
    Function GetEmployees() As List(Of Employee)
End Interface

这是数据访问类的示例:

Public Class SqlEmployeeDataAccess
    Inherits IEmployeeDataAccess

    Public Function GetEmployee(id As Guid) As Employee Implements IEmployeeDataAccess.GetEmployee
        Dim employee As New Employee()
        ' Connect to SQL DB and populate employee DTO object
        Return employee
    End Function

    Public Function GetEmployees() As List(Of Employee) Implements IEmployeeDataAccess.GetEmployees
        Dim employees As New List(Of Employee)()
        ' Connect to SQL DB and populate list of employee DTO objects
        Return employees
    End Function
End Interface

然后你可以创建类似的类AccessEmployeeDataAccess and OracleEmployeeDataAccess它还实现了 IEmployeeDataAccess 接口。然后,同样在数据访问层中,我将为每个受支持的数据库提供程序创建一个工厂类。我会让所有 DataAccess 工厂实现相同的接口,如下所示:

Public Interface IDataAccessFactory
    Function NewEmployeeDataAccess() As IEmployeeDataAccess
End Interface

Public Class SqlDataAccessFactory
    Implements IDataAccessFactory

    Public Function NewEmployeeDataAccess() As IEmployeeDataAccess
        Return New SqlEmployeeDataAccess()
    End Function
End Class

然后,在我的商务课上,我可能会做这样的事情:

Public Class EmployeeBusiness
    Public Sub New(employeeDataAccess As IEmployeeDataAcess)
        _employeeDataAccess = employeeDataAccess
    End Sub

    Private _employeeDataAccess As IEmployeeDataAcess

    Public Function GetEmployee(id As Guid) As Employee
        Return _employeeDataAccess.GetEmployee(id)
    End Function
End Class

然后在我的企业工厂中,我会做这样的事情:

Public Class BusinessFactory
    Public Sub New()
        Select Case dataAccessType
            Case "SQL"
                _dataAccessFactory = New SqlDataAccessFactory()
            Case "Oracle"
                _dataAccessFactory = New OracleDataAccessFactory()
            Case "Access"
                _dataAccessFactory = New AccessDataAccessFactory()
        End Select
    End Sub

    _dataAccessFactory As IDataAccessFactory

    Public Function NewEmployeeBusiness() As IEmployeeBusiness
        Return New EmployeeBusiness(_dataAccessFactory.NewEmployeeDataAccess())
    End Function
End Class

通过使用一组可与任何数据库提供程序一起使用的数据访问对象,可以大大简化这一过程。为此,您只需使用基本 ADO 类型,如 IDbConnection 而不是 SqlConnection,以及 IDbCommand 而不是 SqlCommand。然后,只要 DataAccess 类需要一个连接,您的数据访问对象就可以请求一个 DB Provider 工厂,该工厂可以创建一个新连接等。然而,当您只是调用存储过程或其他东西时,这更容易做到。通常,特别是当您在代码中动态构建 SQL 语句时,提供程序之间存在太多差异,因此您不能仅对所有数据库提供程序使用相同的 DataAccess 类。

但是,那只是我...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

设计决策:(VB.NET)我应该创建一个类或模块来轻松连接到多个数据库之一吗? 的相关文章

  • 当 AutoGenerateColumns="true" 时动态设置 gridview 列的宽度

    当我使用属性 AutoGenerateColumns 为 AutoGenerateColumns true 时 我在设置 gridview 的宽度时遇到问题 gridview 是在代码后面进行数据绑定的 如果我使用 gridview1 co
  • 用于确定应用程序是否在 Citrix 或终端服务上运行的 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个可以调用的 API 函数来确定软件是否在 Citrix 终端服务或独立 PC 上运行 最
  • 环回:原子读取和更新

    有没有办法在环回中实现类似的东西 LOCK READ INCREMENT UNLOCK 我想将计数器保留为数据库值 每个键都是一个计数器 或一个设置 并且它们不应该同时访问我的多个请求 此外 这也应该适用于本地请求 无 RemoteHook
  • 如何将两个django模型(表)合并为一个模型(表)

    我想合并两个 django 模型并创建单个模型 我们假设 我有第一个表表 A 其中包含一些列和数据 Table A col1 col2 col3 col4 x1 x2 x3 x4 y1 y2 y3 y4 我还有另一个表 Table B 其中
  • 非关系数据库设计[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有兴趣了解您使用过的设计策略非关系型 nosql 数据库 也就是说 不使用传统关系设计或 SQL 的 大多数是新的 数据存储类 例如
  • “更新/取消”按钮不会出现在模板字段编辑按钮中

    当您使用 Gridview 的每一行创建编辑按钮时CommandField单击后它会显示更新 取消按钮 以便您可以接受 取消更改 但是 我想要一个带有工具提示文本的编辑按钮 因为CommandField没有工具提示属性 我用过Templat
  • DB2连接授权失败原因:Java不支持安全机制

    我正在尝试使用 DB2JDBC Type4 驱动程序配置 DB2 连接 但我收到这个错误 线程 main 中的异常 com ibm db2 jcc am SqlInvalidAuthorizationSpecException jcc t4
  • Elasticsearch 聚合过滤器

    因为我在谷歌上找不到任何东西 是否可以在elasticsearch中过滤聚合 我正在考虑这样的事情 获取 SOME object X gt 100 的所有对象 提前致谢 编辑 样本数据 我有以下文档结构 docKey 1 value 2 d
  • Visual Studio 多个启动项目之间存在延迟?

    如何在解决方案中的启动项目之间添加一些延迟 我希望客户端项目在启动 WindowsService 后 2 3 秒后启动 为什么我需要这个 WindowsService运行socket服务器 Client运行socket来连接服务器 Wind
  • PostgreSQL 中字符串列类型的索引数组

    是否可以在类型为的列上创建索引文本数组 尝试使用GIN索引 但查询似乎没有使用这些索引 Example CREATE TABLE users name VARCHAR 100 groups TEXT Query SELECT name FR
  • 无法使用 dataformatstring 格式化日期时间

    由于某种原因 我无法在网格视图中格式化日期文本
  • 使用 Greasemonkey 时存储数据

    使用 Greasemonkey 时是否有存储大量数据的好方法GM setValue只是没有削减它 那么这里有一些选项 设置服务器来保存数据 对于用户 并使用 xhr 来 创建 编辑 删除数据 谷歌应用程序 发动机 GAE http code
  • 使用 VB.NET 检查 Word 文档中的字体样式

    我想使用vb net检查一个word文件 并检查文档中的样式是否正确 我必须在word文档中检查这些表达式 a Verdana 16 pt Bold Red b Verdana 12 pt Bold Italic Blue c Verdan
  • Visual Studio 2022 - 编译旧应用程序时出错

    我们正在尝试在 Visual Studio 2022 中使用 VB6 32 位应用程序 编译 2002 年以来非常旧的应用程序 我们需要调试此应用程序并能够在 Windows 10 计算机上运行此应用程序 编译时 我们发现以下错误 这似乎是
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • 什么是数据库池?

    我只是想了解数据库连接池的概念以及它是如何实现的 数据库联系池是一种用于保持数据库连接打开的方法 以便其他人可以重用它们 通常 打开数据库连接是一项昂贵的操作 尤其是在数据库位于远程的情况下 您必须打开网络会话 进行身份验证 检查授权等等
  • 数据库分片和 Rails

    在 Rails 中处理分片数据库的最佳方法是什么 分片应该在应用层 活动记录层 数据库驱动层 代理层还是其他层处理 各自的优点和缺点是什么 FiveRuns 有一个名为的 gem数据结构 https github com bpot data
  • 将古吉拉特语文本插入 MySQL 表会产生垃圾字符和不可读的文本

    我有三个 MySQL 表 我正在向其中插入古吉拉特语内容 当我插入两个表时 它们插入得很好并且可读 但在一个表中 它显示垃圾字符 不可读的文本 我怎样才能解决这个问题 MySQL 有每个表的字符集设置 http dev mysql com
  • 在javascript中访问隐藏字段值

    我的表单中有一个隐藏字段 我正在服务器上设置隐藏字段的值并尝试从 javascript 访问该值 我收到错误 无法获取属性 值 的值 对象为 null 或未定义 如果我查看源代码 则会设置隐藏字段值 并且隐藏字段的 ID 与我正在调用的 I
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个

随机推荐