代码之家  ›  专栏  ›  技术社区  ›  user74754

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

  •  3
  • user74754  · 技术社区  · 16 年前

    我已经试着调试以下问题好几个星期了-这个方法是从同一个数据模块的多个地方调用的,但是这个例外(在本文的主题行中)只有在使用了用于特定目的的整数(提货订单和我们通过承运人发货的订单)时才会发生,不要问我应用程序如何区分一个整数的目的和另一个整数的目的!此外,我不能在我的机器上复制此问题-错误发生在仓库机器上,但不是我自己的开发机器上,即使使用同一个生产数据库。我怀疑这两台计算机之间存在MDAC版本冲突,但已运行版本检查器并确认这两台计算机都在运行2.8,此外还通过在运行时记录tadodaset的.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 数据库信息:(数据库名称和实例)

    设置参数。

    打开了数据集。


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

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

    设置参数。

    参数设置完毕。

    错误:packageID 10813711的参数类型错误、超出可接受范围或彼此冲突


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

    仍然 知道当我试图从一个主值中查找一个二级值时抛出一个异常,但只针对提货订单,而且只针对仓库中的一台机器, 但是 我可能遗漏了一些简单的东西。因此,任何人能提供的帮助都将不胜感激。

    4 回复  |  直到 15 年前
        1
  •  1
  •   KevinRF    16 年前

    搜索 CodeGear/Embarcadero newsgroups

    另一个建议是在禁用/启用控件中包装数据集的打开。如果数据集绑定到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
  •  0
  •   Larry Lustig    16 年前

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

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

        3
  •  0
  •   AlexV    16 年前

    在Delphi2009下,我对ADO+MySQL也有类似的问题。根据表规则,TDateTime字段是必需的(非空)。MySQL接受虚拟日期“0000-00-00 00:00:00”作为非空值,ADO不识别此日期/时间值。返回的错误与您的类似(IIRC是指超出范围的值)。

    这与你所经历的不一样,但它可能有助于你追踪你所遇到的问题。

    祝你好运!

        4
  •  0
  •   Rahul W    14 年前

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

    作为参考,我的问题是

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

    当我将这个语句分配给查询对象(TADOQuery)时,我会得到同样的错误,但是有了新的连接,它就工作了。

    推荐文章