Открытие исключения TAdoDataset: Аргументы имеют неправильный тип, находятся вне допустимого диапазона или конфликтуют друг с другом - PullRequest
3 голосов
/ 09 марта 2010

Я пытался отладить следующую проблему уже несколько недель - этот метод вызывается из нескольких мест в одном и том же модуле данных, но это исключение (из строки темы этого поста) происходит только тогда, когда целые числа для определенной цели (заказы на вывоз по сравнению с заказами, которые мы отправляем через перевозчика) - и не спрашивайте меня, как приложение может определить разницу между целью одного целого и другим! Кроме того, я не могу продублировать эту проблему на своем компьютере - ошибка возникает на компьютере хранилища, но не на моем компьютере разработчика, даже при работе с той же производственной базой данных. Я подозревал конфликт версий 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 этот код регистрации регистрирует успешную операцию следующим образом:


Версия: 2.8 Информация БД: (имя базы данных и экземпляр)

Настройка параметра.

Завершено настройка параметра.

Открыл набор данных.


Но тогда, когда обрабатывается «пикап», это исключение выдается при каждом открытии набора данных:
Версия: 2.8

Информация о БД: (имя и экземпляр базы данных)

Настройка параметра.

Закончена настройка параметра.

GetESPackageID () вызвал исключение. Тип: EOleException, Сообщение: Аргументы имеют неправильный тип, находятся вне допустимого диапазона или конфликтуют друг с другом Ошибка: Аргументы имеют неправильный тип, находятся вне допустимого диапазона или конфликтуют друг с другом для packageID 10813711


Я попытался исключить параметр и создал командный текст для этого набора данных программно, подозревая, что некоторая часть конфигурации TParameter может быть не в порядке, но та же ошибка возникает при тех же обстоятельствах. Я испробовал каждую комбинацию свойств TParameter, о которой могу подумать - это миллионный TParameter, который я создал для своего миллионного набора данных, и я никогда не сталкивался с этой ошибкой. Я даже создал второй набор данных с нуля и удалил все ссылки на исходный набор данных на случай, если какое-либо свойство исходного набора данных в .dfm может быть повреждено, но такая же ошибка возникает при тех же обстоятельствах. Текст команды для этого набора данных является простым
select ValueA from TableName where ValueB = @ParameterB

Я готов сделать что-то экстремальное, например, написать веб-сервис для поиска этих значений - сейчас мне кажется, что я могу уничтожить свой компьютер, перестроить его, переписать все это приложение с нуля и приложение по-прежнему знает, что нужно выдавать исключение всякий раз, когда я пытаюсь найти вторичное значение из первичного значения, но только для заказов на получение и только с одного компьютера на складе, , но Я, наверное, упускаю что-то простое. Поэтому любая помощь, которую кто-либо может оказать, будет принята с благодарностью.

Ответы [ 4 ]

1 голос
/ 09 марта 2010

Поиск Группы новостей CodeGear / Embarcadero Мне удалось найти только эту ошибку, связанную с установкой / использованием свойства Filter. Я бы искал проект, ища что-нибудь, устанавливающее свойство Filter компонента, и проверял бы, связан ли компонент с какими-либо элементами управления пользовательского интерфейса, которые могли бы косвенно установить свойство filter (например, TcxGrid DevExpress, диалог Filter 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;

Удачи

0 голосов
/ 12 сентября 2011

Я также столкнулся с той же проблемой при использовании MySql с драйвером ODBC в Delphi XE. Ошибка выскакивает из InternalRefresh набора данных. Я создал обходной путь: когда мы создаем новый объект подключения и применяем его к объекту запроса, ошибка не возникает. Попробуйте создать новый объект подключения и проверьте. Я не проверял много об этом поведении, но это решило проблему для меня.

Для справки, мой запрос был

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

Всякий раз, когда я назначаю этот оператор объекту запроса (TADOQuery), я получаю ту же ошибку, но с новым соединением это работает.

Надеюсь, это поможет.

0 голосов
/ 09 марта 2010

Вам необходимо определить, идет ли ошибка из вашего приложения или из базы данных. Напишите небольшой исполняемый файл, который не выполняет ничего, кроме выполнения буквальной команды SQL (со значением параметра, жестко запрограммированным в SQL), и посмотрите, будет ли он выполняться на рабочей станции, которая вызывает у вас проблему.

Я обнаружил, что ADO возвращает сообщение о том, что параметр не имеет значения по умолчанию, когда я отправляю команду с неверным именем столбца в MS Access. Сообщение об ошибке не особенно полезно в этом контексте. Для отладки такого рода ошибок я регистрирую фактический SQL, который отправляется в базу данных, а затем вырезаю и вставляю его в Access или какую-либо другую подпрограмму консольного типа, чтобы посмотреть, виноват ли сам SQL.

0 голосов
/ 09 марта 2010

У меня была похожая проблема с ADO + MySQL под Delphi 2009. Проблема была с полем TDateTime, которое было обязательным (NOT NULL) согласно правилам таблицы. MySQL принимает фиктивную дату '0000-00-00 00:00:00' как ненулевое значение, и ADO не распознает это значение даты / времени. Возвращенная ошибка была похожа на вашу (IIRC, о которой говорилось за пределами допустимого диапазона).

Это не то же самое, что вы испытываете, но это может помочь вам отследить возникшую проблему.

Удачи!

...