delphi - 异常打开 TAdoDataset : Arguments are of the wrong type, 超出可接受的范围,或者相互冲突

标签 delphi ado delphi-2007

我已经尝试调试以下问题几个星期了 - 该方法是从同一数据模块内的多个位置调用的,但此异常(来自本文的主题行)仅在用于特定目的的整数时发生(取货订单与我们通过承运商运送的订单)的使用 - 不要问我应用程序如何区分一个整数的用途和另一个整数的用途!此外,我无法在我的计算机上重复此问题 - 即使在使用相同的生产数据库时,错误也发生在仓库计算机上,而不是我自己的开发计算机上。我怀疑两台机器之间存在 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

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

设置参数。

参数设置完成。

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

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

select ValueA from TableName where ValueB = @ParameterB

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

最佳答案

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

另一个建议是将数据集的打开包装在禁用/启用控件中。如果数据集绑定(bind)到 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;

祝你好运

关于delphi - 异常打开 TAdoDataset : Arguments are of the wrong type, 超出可接受的范围,或者相互冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2404871/

相关文章:

sql-server-2005 - 部署 SQL Server : installing a second instance?

delphi - 如何将 800000 条记录插入 MS Access 表中?

Delphi OpenTools API - 编辑项目需要子句

multithreading - Delphi VCL 中的 AutoThread 类?

sql - 如何使用 ADO 查询参数指定表名和字段名?

stored-procedures - 经典 ASP - ADO 执行传递参数的存储过程

delphi - D2007 ClientDataset

delphi - 如何制作从 TBlob 到 TBitmap 的 LiveBinding 转换器

delphi - 以字符串格式存储日期值的最佳方法是什么?

sql - 如何允许整数在 combobox.value 中接收 null?