异常打开TAdoDataset:参数类型错误,超出可接受的范围,或者彼此冲突

时间:2010-03-08 21:24:42

标签: 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

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

设置参数。

完成参数设置。

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

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

select ValueA from TableName where ValueB = @ParameterB

我准备做一些极端的事情,例如编写一个Web服务来查看这些值 - 现在感觉好像我可以破坏我的机器,重建它,从头开始重写整个应用程序,以及应用程序每当我尝试从主值中查找辅助值时,仍然仍然知道抛出异常,但仅针对取件订单,并且仅来自仓库中的一台机器,但是

4 个答案:

答案 0 :(得分:1)

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

另一个建议是在disable / enablecontrols中打开数据集。如果数据集绑定到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;
祝你好运

答案 1 :(得分:0)

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

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

祝你好运!

答案 2 :(得分:0)

您需要确定错误是来自您的应用程序还是基础数据库。编写一个小的可执行文件,除了执行文字SQL命令(参数值硬编码到SQL中)之外什么都不做,看看它是否会在给你问题的工作站上运行。

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

答案 3 :(得分:0)

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

供参考,我的查询是

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

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

希望这可能有所帮助。