【问题标题】:Forget to reset parameter for production version忘记重置生产版本的参数
【发布时间】:2015-08-06 19:34:36
【问题描述】:

我使用 TAdoconnection 来访问数据库。 在开发过程中,我将连接字符串设置为我的本地数据库并将连接设置为 true,以便获取其他 dbcomponents 的信息。

当我为客户完成程序时,有时我会忘记重置参数,这会导致客户计算机出现异常,因为连接字符串无效。

我试图在数据模块(第一行)的 oncreate 事件中添加一个 connected:=false ,但似乎为时已晚。 我如何确保该程序具有适合客户的正确设置? 我尝试在条件编译短语中设置一些参数,例如:

{$IFDEF PRODUCT}
param1:=..
....
{$ENDIF} 

但我不知道如何为可视组件执行此操作。

【问题讨论】:

  • dfm 文件中没有条件代码。只是不要将您的开发设置提交给修订控制系统。大概你总是在提交之前审查更改?
  • @DavidHeffernan 我并没有真正使用修订控制系统。我的系统被称为具有特殊备份功能的 windows 文件夹。在之前的项目中,我接触过一些系统,但我从未见过从源代码中“剥离”我的开发设置的可能性
  • 没有版本控制就不是真正的软件开发。
  • 如果您使用版本控制系统,您会帮自己一个大忙。至少,您可以免费配置本地git。您甚至可以注册 github 进行简单的异地备份。 (如果您不介意您的存储库是公开的,也可以免费使用。)
  • 也就是说。解决您的问题的一个更简单的方法是:确保您的开发环境以与生产环境相同的方式运行。 IE。不要依赖设计时的活动连接来进行开发。你可以更进一步;如果您不小心保持连接处于活动状态(例如,因为您打开了表格以在网格中预览),您可以轻松检测到这一点并报告错误。这样一来,如果您总是在剪切新的产品版本之前至少运行一次应用程序,那么您不太可能犯在设计时连接处于活动状态的情况下发布的错误。

标签: delphi components delphi-2009


【解决方案1】:

您可以在运行时对事件 TADOConnection.OnBeforeConnect 设置 true ConnectionString:

procedure TDM1.ADO1BeforeConnect(Sender: TObject);
begin
  ADO1.ConnectionString := 'Provider=SQLOLEDB;......';
end;

或者你可以延迟连接

var CanConnect: Boolean;
procedure TDM1.ADO1BeforeConnect(Sender: TObject);
begin
  if not CanConnect then Abort;
end;

【讨论】:

  • 在我看来,提问者希望能够在设计时设置属性。
  • 对我来说,使用 beforeconnect 或 setconnected 似乎是最有希望的解决方案
  • @Christine 你想在设计时设置连接字符串吗?
  • 我在运行时设置了连接字符串,因为我允许用户使用多个数据库,所以可以更改数据库。我还使用 INI 文件来存储实际的数据库名称。我不喜欢将内部信息与 INI 文件中的客户信息混为一谈。我的应用程序没有提供 INI 文件,它将在用户站点上创建。
  • 根据您关心的设计时设置的问题。你能理解我的困惑吗?
【解决方案2】:

您不能在 dfm 文件中使用条件。这意味着如果您在设计时设置属性,那么它们将在运行时无条件地应用。

如果您必须避免发布设置了某些属性的软件,那么您必须阻止自己这样做。运行时的编程解决方案不是一种选择。

我个人会使用我的版本控制流程来提供帮助。每当我提交更改时,我都会查看所有更改。我希望检查 dfm 更改是我日常工作的一部分。

最重要的是,我会在发布软件之前对其进行测试。该测试需要在洁净室环境中进行。您需要一个代表目标部署环境的虚拟机快照。在您的开发机器上进行测试显然不是一个可行的选择。

【讨论】:

    【解决方案3】:

    正如其他人所说,源代码控制系统可以帮助检测 .DFM 文件的更改,但是,您还可以使用其他一些工具/想法。

    以下是一些不会对您当前的部署过程产生太大影响的想法:

    1) Connected 属性:GExperts GExperts 包含一个 IDE 插件,可以在编译时检测打开的连接,并自动为您将 connected 属性设置为 false。至少,您可以使用该工具手动检测和更改,或者让该工具为您完成。该功能可以在 GExperts 菜单中找到:配置,设置组件属性,然后添加 TAdoConnection,属性:已连接,值:false。

    2) ConnectionString: 将您的连接字符串移动到 .ini 文件或注册表中,并具有两个值,一个用于开发,一个用于生产。在您的代码中,根据标志设置每个,或使用:

     if debughook <> 0 then
       // fetch design-time connection string
     else
       // fetch production connection string
    

    我还建议您考虑使用 FinalBuilder 等软件自动化构建过程。

    【讨论】:

      猜你喜欢
      • 2019-11-03
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多