设计决策:(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)我应该创建一个类或模块来轻松连接到多个数据库之一吗? 的相关文章

  • 我们可以使用sql列出MS Access数据库中的所有表吗?

    我们可以使用 sql 找到 ms access 中的所有表吗 就像我们在 sql server 中所做的那样 select from sys tables 在sqlite中 SELECT FROM sqlite master where t
  • Guid.NewGuid().GetHashCode() 用于数据库

    这对于用作数据存储 SQL Server 的 ID 可靠吗 我会使用 guid 但我更喜欢数字值 A guid更有可能代表一个记录uniquely than a numeric value 随着 GUID 确保全球唯一性 GUID 可以跨数
  • 如何选择从数据集中进入数据表的列?

    作为数据工作的新手 我希望我能正确地提出这个问题 如何选择从数据集中进入数据表的列 我知道我可以使用 填充数据表 DataTable table dataSet1 Tables 0 但这会引入所有列 如何仅使用某些列填充数据表 我正在使用
  • 如何确定任务栏位于哪个屏幕

    Screen PrimaryScreen 并不总是有效 因为在多显示器设置中 用户可能会将其任务栏移动到主屏幕以外的屏幕 找到具有最小工作区域的屏幕也不起作用 因为可能存在具有不同分辨率的显示器 有什么办法可以通过任务栏定位屏幕吗 您可以使
  • 更改列名称 Rails

    我有这张表 class CreateShoes lt ActiveRecord Migration def change create table shoes do t t string name t boolean leather t i
  • 如何使用 aerospike 加载器在 aerospike 中加载嵌套的 csv 文件?

    我已将 JSON 文件转换为 CSV 格式 现在使用 aerospike 加载器将 CSV 加载到 Aerospike 中 我可以为简单的结构执行此操作 但如何修改 allDatatype json 的内容以在 Aerospike 中加载嵌
  • 导轨中的多个 DB 连接

    我正在尝试在 ROR 应用程序中连接多个数据库 我的 database yml 如下所示 在你的database yml文件中 发展 adapter mysql username root password database example
  • 使用 LINQ 的 Silverlight 客户端数据库

    我正在创建一个浏览器外 silverlight 应用程序 并希望在客户端有一个数据库 我看过 sqlite 但似乎它不适用于 silverlight 如果我能使用 LINQ 那就太好了 我更喜欢免费的解决方案 但付费始终是一种选择 有什么建
  • 不使用 Django 的 Python 数据库(适用于 Heroku)

    令我惊讶的是 我没有发现其他地方提出过这个问题 简而言之 我正在编写一个应用程序 计划部署到云 可能使用 Heroku 它将执行各种网络抓取和数据收集 它将位于云中的原因是 我可以将其设置为每天自行运行 并将数据提取到数据库 而无需我的计算
  • vb.net if 简写

    有没有办法使用速记来做这样的事情 If Not txtBookTitle Text String Empty Then objBook DisplayName txtBookTitle Text End If objBook Display
  • 如何使用网络浏览器控件填写 html 表单

    在VB6 classic中 我们可以这样做 Private Sub Form Load WebBrowser1 Navigate2 http yourSite com End Sub Private Sub Command1 Click W
  • 动态连接字符串数据库C#

    我总是使用这行代码进行连接 string ConnectString datasource mysource username myusername password mypassword database mydatabasename 这
  • WPF DataGrid 显示点而不是逗号

    在网上查找并寻找答案后没有结果 我想向您寻求帮助 我有一个包含 2 列的 SQL 数据库表 浮点数据类型 例如 1 2 1 3 1 4 等 绑定到一个DataGrid XAML 代码
  • 如何获取sql server 2005中数据库连接的详细列表?

    如何获取sql server 2005中数据库连接的详细列表 使用系统存储过程sp who2
  • oracle嵌套表的最大行数是多少

    CREATE TYPE nums list AS TABLE OF NUMBER Oracle 嵌套表中最大可能的行数是多少 UPDATE CREATE TYPE nums list AS TABLE OF NUMBER CREATE OR
  • 是否可以在MySQL UDF中的IF条件中声明游标

    我可以在 if 语句中声明游标吗 如果可能的话我怎样才能做到 因为我刚刚做了这样的光标 CREATE FUNCTION fn test ProductID BIGINT 20 RETURNS DECIMAL 10 2 BEGIN DECLA
  • ASP.NET DropDownList OnSelectedIndexChanged 事件未触发

    我试图同时使用一些 AJAX 和 ASP Net 来运行函数而无需刷新整个页面 但我在执行此操作时偶然发现了一个问题 这是我的代码
  • 在 Codeigniter 中从其他数据库切换动态数据库

    mi 文件 config php 是 active group default active record TRUE db master 是唯一的数据库 db master hostname localhost db master user
  • jsp/servlet 从数组填充下拉框

    大家好 我正在尝试创建一个表单 允许您为某个主题创建一个实验室 它有一个下拉框 您可以在其中选择与该用户相关的主题 但是 当我去加载页面时 我收到此错误g apache jasper JasperException java lang Nu
  • 是否可以更新 amazon dynamodb 中的哈希键?

    我想更新 amazon dynamodb 表中的哈希键值 我在同一张表中也有一个范围键 是否有可能做到这一点 您无法更新哈希键值 您必须删除并重新创建该项目 这是相关的aws文档http docs aws amazon com amazon

随机推荐