【问题标题】:Exception opening TAdoDataset: Arguments are of the wrong type, are out of acceptable range, or are in conflict with one another异常打开 TAdoDataset:参数类型错误、超出可接受范围或相互冲突
【发布时间】:2010-03-08 21:24:41
【问题描述】:

几周以来,我一直在尝试调试以下问题 - 从同一数据模块中的多个位置调用此方法,但此异常(来自本文的主题行)仅在整数用于特定目的时发生(提货订单与我们通过承运人运送的订单)被使用 - 不要问我应用程序如何区分一个整数的目的和另一个整数的目的!此外,我无法在我的机器上复制这个问题——错误发生在仓库机器上,而不是我自己的开发机器上,即使使用相同的生产数据库也是如此。我怀疑两台机器之间存在 MDAC 版本冲突,但已运行版本检查器并确认两台机器都在运行 2.8,另外还通过在运行时记录 TAdoDataset 的 .Version 属性来确认这一点。

function TdmESShip.SecondaryID(const PrimaryID : Integer ): String;
begin
    try
      with qESPackage2 do
        begin
          if Active then
              Close;
          LogMessage('-----------------------------------');
          LogMessage('Version: ' + FConnection.Version);
          LogMessage('DB Info: ' + FConnection.Properties['Initial Catalog'].Value + ' ' +      FConnection.Properties['Data Source'].Value);
          LogMessage('Setting the parameter.');
          Parameters.ParamByName('ParameterName').Value := PrimaryID;
          LogMessage('Done setting the parameter.');
        Open;

此日志记录代码在 100 次中有 99 次记录成功操作,如下所示:


版本:2.8 数据库信息:(数据库名称和实例)

设置参数。

参数设置完毕。

打开数据集。


但是,每当处理“提货”订单时,只要打开数据集,就会引发此异常:
版本:2.8

数据库信息:(数据库名称和实例)

设置参数。

参数设置完毕。

GetESPackageID() 引发异常。类型:EOleException,消息:参数类型错误、超出可接受范围或相互冲突 错误:参数类型错误、超出可接受范围或在 packageID 10813711 中相互冲突


我已尝试消除该参数并以编程方式为此数据集构建命令文本,怀疑 TParameter 的配置的某些部分可能不正常,但在相同情况下会发生相同的错误。我已经尝试了所有我能想到的 TParameter 属性组合——这是我为我的第 100 万个数据集创建的第 100 万个 TParameter,我从未遇到过这个错误。我什至从头开始创建了第二个数据集,并删除了对原始数据集的所有引用,以防 .dfm 中原始数据集的某些属性可能已损坏,但在相同情况下会发生相同的错误。 该数据集的命令文本很简单
select ValueA from TableName where ValueB = @ParameterB

我正准备做一些极端的事情,比如编写一个 Web 服务来查找这些值 - 现在感觉好像我可以摧毁我的机器,重建它,从头开始重写整个应用程序,以及应用程序仍然知道每当我尝试从主要值中查找次要值时抛出异常,但仅适用于取货订单,并且仅来自仓库中的一台机器,但是 em> 我可能遗漏了一些简单的东西。因此,任何人都可以提供任何帮助,我们将不胜感激。

【问题讨论】:

  • 我发现这个软件的用户可以选择打印一个文件,如果打印对话框出现过,不管文件是否打印,打开这个对话框就是导致后面的异常打开 TAdoDataset。然而,我找不到这两个动作之间的逻辑关联,即使因果关系似乎是 100% 可靠的。从那以后,我已经调换了部门,但怀疑打印机对话框的底层窗口功能可能被错误地调用,导致某些东西处于不一致的状态。
  • 此消息“参数类型错误、超出可接受范围或相互冲突”是标准 OLE 错误消息代码,当某些选项无效时可以从 ADO 返回,并且 OLE/COM 方法返回此标准故障代码。
  • 我应该修改这个求助请求,说明我现在完全不在 Delphi 工作,所以我个人解决这个问题的机会现在已经没有了。我组织的大部分现有 Delphi 代码库很快就会移植到 .NET。谢谢大家!

标签: delphi ado delphi-2007


【解决方案1】:

搜索 CodeGear/Embarcadero newsgroups 我只能找到与设置/使用 Filter 属性相关的错误。我会在项目中搜索设置组件的 Filter 属性的任何内容,并检查组件是否绑定到任何可以间接设置过滤器属性的 UI 控件(例如 DevExpress 的 TcxGrid、Infopower 的过滤器对话框等)

另一个建议是将数据集的打开包装在禁用/启用控件中。如果数据集绑定到 UI 控件,则控件不应尝试应用任何可能导致异常的操作(应用过滤器)。

function TdmESShip.GetESPackageID(const PackageID : Integer): String;
var
  ESPackageID :string; // for debugging
begin
  with qESPackage do
      begin
         ESPackageID := '';
         DisableControls();
         try
            try
               Parameters.ParamByName('PackageID').Value := PackageID;
               Open();
               if NOT(IsEmpty()) then
                 begin
                    ESPackageID := qESPackageESPackageID.AsString;
                 end;
               Close();  // No need to keep open
            except
               on E:Exception do
                  begin
                     ESPackageID := '9999999'; // ex. return a known bogus value
                     // log the error, re-raise a more meaningful error, etc
                  end;
               end;
         finally
            EnableControls();
            Result := ESPackageID;
         end;
     end;
end;

祝你好运

【讨论】:

    【解决方案2】:

    您需要确定错误是来自您的应用程序,还是来自底层数据库。编写一个只执行文字 SQL 命令(将参数值硬编码到 SQL 中)的小型可执行文件,看看它是否会在出现问题的工作站上运行。

    当我向 MS Access 发送列名错误的命令时,我发现 ADO 会返回有关参数没有默认值的消息。错误消息在这种情况下并不是特别有用。为了调试这种错误,我记录了发送到数据库的实际 SQL,然后将其剪切并粘贴到 Access 或其他控制台类型的例程中,以查看 SQL 本身是否有问题。

    【讨论】:

      【解决方案3】:

      我在 Delphi 2009 下与 ADO + MySQL 有类似的问题。问题出在 TDateTime 字段上,根据表规则,该字段是必需的(非空)。 MySQL 接受虚拟日期 '0000-00-00 00:00:00' 作为非空值,ADO 无法识别此日期/时间值。返回的错误与您的错误相似(IIRC 是关于超出范围的值)。

      这与您遇到的情况不同,但它可能会帮助您跟踪您遇到的问题。

      祝你好运!

      【讨论】:

        【解决方案4】:

        在 Delphi XE 中使用 MySql 和 ODBC 驱动程序时,我也遇到了同样的问题。该错误从数据集的 InternalRefresh 弹出。我创建了一个解决方法,当我们创建一个新的连接对象并应用于查询对象时,错误不会出现。尝试创建新的连接对象并检查。我没有对这种行为进行太多检查,但它已经为我解决了问题。

        作为参考,我的查询是

        INSERT INTO USERS (UserId, Password, Created_at) Values (:UID, :PWD, :CAT)
        

        当我将此语句分配给查询对象 (TADOQuery) 时,我会遇到相同的错误,但使用新连接时它可以工作。

        希望这可能会有所帮助。

        【讨论】:

          【解决方案5】:

          我遇到了类似的问题,并验证错误在数据内部,在数据内部有 #0 导致数据损坏。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2023-04-06
            • 1970-01-01
            • 1970-01-01
            • 2013-11-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多