【问题标题】:How can I execute code stored in a database?如何执行存储在数据库中的代码?
【发布时间】:2012-06-08 09:42:02
【问题描述】:

例如,如何将方法体存储在数据库中并在以后运行它? (我使用的是 Delphi XE2;也许 RTTI 会有所帮助。)

【问题讨论】:

  • @DavidHeffernan 并将 dll 存储在数据库中? ;)
  • 您是否考虑过为此任务使用一些脚本引擎?
  • DLL:简单。脚本引擎:困难。任你选:D
  • DLL 用什么方法容易?易于下载和运行?也许,一开始。易于版本化?易于检查?很容易确保每个工作站上都​​存在所需的依赖关系,这些工作站将下载和运行这个 DLL?很容易确定在您的应用程序的未来版本中可以使用吗?不太好。远离“数据库中的 DLL blob”——多么可怕的想法。
  • 我从来没有说过它是更好的选择,脚本引擎是最好的选择。我强调的是难度和复杂程度。

标签: database delphi delphi-xe2


【解决方案1】:

恕我直言,您最好的选择是使用脚本引擎并将脚本存储在数据库中。

或者,您可以将代码放入 dll 中,然后将该 dll 放入数据库中。有用于将 dll 从资源加载到 ram 并对其进行处理的代码,以便可以像使用 LoadLibrary 加载一样使用它,例如in dzlib。我真的不知道是否适用于任何 dll 以及适用于哪些版本的 Windows,但它适用于我尝试过的那些。

【讨论】:

    【解决方案2】:

    RTTI 不是完整的语言解释器。 Delphi 是一种编译语言。您编写、编译并仅分发您的二进制文件。除非您是 Embarcadero,否则您无权分发 DCC32(命令行编译器)。

    然而,JVCL 包含一个类似于 delphi 的语言子集,该子集封装在一个非常易于使用的组件中,称为“JvInterpreter”。您可以编写一些代码(如帕斯卡)并将其放入数据库中。然后,您可以从数据库中“运行该代码”(解释,而不是编译)。通常,这些应该是调用代码中方法的过程。您必须编写一些“包装器”来公开您希望向解释器公开的已编译 API(提供对实时数据、数据库连接对象或表/查询对象的访问)。你认为这听起来很完美,对吧?嗯,这是个陷阱。

    提防名为“the configuration complexity clock”的东西。你刚到 9 点钟,那是许多痛苦和折磨的开始。就像当您遇到问题并使用正则表达式解决它时,“现在您有两个问题”,将脚本和 DSL 添加到您的应用程序可以解决一个问题并创建多个其他问题。

    虽然我认为“将 DLL 存储在数据库 blob 字段中”的想法是邪恶且荒谬的,但我认为在应用程序中肆意添加脚本和特定领域的语言也会带来很多痛苦。首先问问自己其他更简单的解决方案是否可行。然后应用 YAGNI 原则(You Ain't Gonna Need It)和 KISS(keep-it-simple-smartguy)。

    在实施您在问题中所要求的任何事情之前,请三思而后行。

    【讨论】:

    • 我很确定 Warren 知道确切的含义。这样听起来不那么粗鲁了。
    • 莱昂纳多正在追赶我。
    猜你喜欢
    • 2014-11-30
    • 1970-01-01
    • 2014-11-16
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    相关资源
    最近更新 更多