Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多台计算机上的许多程序使用的DAL框架_C#_Database_Data Access Layer_Business Logic - Fatal编程技术网

C# 多台计算机上的许多程序使用的DAL框架

C# 多台计算机上的许多程序使用的DAL框架,c#,database,data-access-layer,business-logic,C#,Database,Data Access Layer,Business Logic,在我们的项目中,我们有许多分散在多台计算机上的小程序,每个程序负责针对遗留数据库的特定任务。如今,它们是用Fortran 77编写的,并使用非常过时的数据库访问框架 我们正在考虑开始用C语言开发,并研究如何最好地创建一个所有应用程序都可以使用的数据库框架。当旧的实时数据库不支持SQL时,我们不能使用任何现有的框架 我正在考虑从数据库定义生成一个带有T4的DAL。 然而,我看到的问题是,当数据库发生更改并且必须重新编译DAL时会发生什么。将包含DAL的dll文件复制到所有计算机就足够了,还是我们必

在我们的项目中,我们有许多分散在多台计算机上的小程序,每个程序负责针对遗留数据库的特定任务。如今,它们是用Fortran 77编写的,并使用非常过时的数据库访问框架

我们正在考虑开始用C语言开发,并研究如何最好地创建一个所有应用程序都可以使用的数据库框架。当旧的实时数据库不支持SQL时,我们不能使用任何现有的框架

我正在考虑从数据库定义生成一个带有T4的DAL。 然而,我看到的问题是,当数据库发生更改并且必须重新编译DAL时会发生什么。将包含DAL的dll文件复制到所有计算机就足够了,还是我们必须重新编译到应用程序

数据库的实际结构不会经常改变。但是,很多查找常量都会定期更改。通常,不会删除任何常量,但它们可以获得新值​​或者可以添加新的。如果有任何常数被删除,使用它的程序无论如何都必须重写

我担心这可能会成为一个维护问题,并寻求更好的解决方案

编辑

主键在数据库中不是常量,而是每年重新生成一次。为了使程序能够在数据库中找到正确的行,使用了查找常量。在现有程序中,常量以
的形式直接用于代码中。然后,预处理器将这些常量替换为当前主键值。这意味着在重建数据库时必须重新编译所有应用程序

因此,无法在BLL中使用例如
GetByKey(int key)
,因为键不是常数。 我看到下面列出了许多不同的解决方案,哪些是好的,哪些是坏的?如果您看到其他更好的解决方案,请告诉我:

  • 在DAL中定义查找常量:

    BLL.TableName.GetByKey(DAL.TableNameLookup.RowName)

    • 优点:我在DAL中定义的常数,如果查找发生变化,我不必替换BLL
    • 缺点:冗长的语法
  • 在BLL中定义查找:

    BLL.TableName.RowName

    • 优点:语法简单
    • 缺点:当查找常量更改时,我必须更新BLL
这可以通过代码生成(T4)和。如果使用Om DynamicObject,则可以在易于更新的XML文件中定义常量。然而,这将大大放缓


我认为这些方法都不好。请帮我想出更好的方法。

使用DAL和应用程序之间的另一层。(例如:BL业务层)


在BL中调用DAL层方法,并从应用程序调用BL层。这样做可以避免DAL和应用程序之间的依赖关系。然后,当您在数据库中进行更改时,只更改DAL层并替换dll。无需对DAL中的每个更改编译应用程序。

但如果我正确理解了所有内容,请返回映射数据库中列的对象。如果列更改,BL返回的对象也将更改。或者我误解了什么?你应该把这些列映射到DAL。在DAL中,可以将映射的数据转换为对象。将该对象返回到BL。BL不会直接映射到列。如果更改数据库,则应仅更改DAL。因为BL仍然需要来自DAL的对象。(从DAL必须向BL发送相同类型的对象)。那么数据库更改将不会影响应用程序。一旦你改变了DB,改变DAL以返回BL.aaa所需的正确对象,我有点误解了。你是对的,我可能可以在程序和DAL之间使用BLL。但我仍然存在的一个问题是,数据库在很大程度上依赖于查找常量。我在这个问题的补充部分写了更多关于他们的内容。你对我如何解决这个问题有什么建议吗?我想你不用担心。因为如果您更新数据库中的查找表数据,就不需要更新DAL。它会自动获取数据库中的查找数据。只有当您更改表结构(设计)时,才应该在DAL中进行更改。如果我理解正确,程序必须首先从查找表中检索当前主键,然后获取所需的行。这将创建对数据库的两个访问。在一个普通的关系数据库中,这个问题已经通过关系解决了,但是在这个旧数据库中不存在这样的问题。我看到的第二个问题是,如果我使用eg字符串作为常量,则没有IntelliSense或编译控件。