Поиск:

Ответ в темуСоздание новой темы Создание опроса
> BOF or EOF = True на sp.Parameters.Refresh 
V
    Опции темы
kami
Дата 26.11.2013, 13:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Добрый день, уважаемые!
Столкнулся с непонятной мне проблемой в виде "EOLEException - BOF или EOF имеет значение True, либо текущая запись удалена."
Но возникает оно на Parameters.Refresh, что как бы вообще не.

Код

sp := TADOStoredProc.Create(nil);
try
  sp.Connection:=ADOConn; // заранее созданное соединение.
  SomeList1.ReadFromDB(sp);
  SomeList2.ReadFromDB(sp);
finally
  sp.Free;
end;

Реализация ReadFromDB почти идентичная:
Код

procedure TSomeList1.ReadFromDB(sp: TADOStoredProc);
begin
  sp.ProcedureName := spSomeProcName1;
  sp.Parameters.Refresh;
  sp.Parameters.ParamByName('ParamName').Value := Value; //  Единственное отличие. У второй процедуры параметра нет.
  // соответственно - нет и этой строки.
  sp.Open;
  try
    ReadFromDS(sp); // здесь - чтение, пока не sp.eof
  finally
    sp.Close;
  end;
end;

procedure TSomeList2.ReadFromDB(sp: TADOStoredProc);
begin
  sp.ProcedureName := spSomeProcName2;
  sp.Parameters.Refresh; // здесь - исключение.
 ...
end;

Callstack указывает на:
  ADODB.RefreshFromADO
  ADODB.TParameters.InternalRefresh
  ADODB.TParameters.Refresh

Меняем местами List1 и List2 - проблема исчезает, но это половинчатое решение - списков может быть несколько, часть с параметрами, часть без.
Почему так и что можно сделать?

Это сообщение отредактировал(а) kami - 26.11.2013, 13:37
PM MAIL WWW   Вверх
Frees
Дата 29.11.2013, 11:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Код

procedure TSomeList1.ReadFromDB(sp: TADOStoredProc);
begin
  sp.Close;//может в нем проблема
  sp.ProcedureName := spSomeProcName1;



--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
kami
Дата 29.11.2013, 14:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Цитата(Frees @  29.11.2013,  11:28 Найти цитируемый пост)
sp.Close;//может в нем проблема

Увы - нет. Пробовал и так, но sp гарантированно закрыта.
Принудительное добавление sp.Close в оба (и по отдельности) метода ReadFromDB результата не дает, ошибка та же...

P.S. изначально забыл сказать - используется D2010, Win7 со всеми обновлениями.
PM MAIL WWW   Вверх
Frees
Дата 3.12.2013, 13:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54




Цитата(kami @  29.11.2013,  17:01 Найти цитируемый пост)
P.S. изначально забыл сказать - используется D2010, Win7 со всеми обновлениями.

если есть демо проект с этой ошибкой, могу проверить на XE3


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
kami
Дата 3.12.2013, 21:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Цитата(Frees @  3.12.2013,  13:06 Найти цитируемый пост)
если есть демо проект с этой ошибкой, могу проверить на XE3

Думаю, что дело не в Delphi... хотя...
Минимальная конфигурация (другой, к сожалению, нет), на которой воспроизводится это хозяйство:
MySQL v5.6 + ODBC драйвер (ох, не помню версию, но вроде последняя - 5.2.6). В параметрах ODBC -подключения всё по умолчанию, кроме: Enable automatic reconnect и Allow multiple statements= True.

Скрипт для БД:
Код

delimiter $$
CREATE DATABASE `test`$$

CREATE TABLE `testtable` (
  `ttID` int(11) NOT NULL AUTO_INCREMENT,
  `ttValue` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`ttID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$

CREATE PROCEDURE `spSomeProc1`(Param INT)
BEGIN
  SELECT `ttID`, `ttValue` FROM `test`.`testtable` WHERE `ttID` = Param;
END$$

CREATE PROCEDURE `spSomeProc2`()
BEGIN
  SELECT `ttID`, `ttValue` FROM `test`.`testtable`;
END$$
DELIMITER ;


Код приложения уместился в один обработчик события:
Код

procedure TForm1.btn1Click(Sender: TObject);
var
  sp: TADOStoredProc;
  conn: TADOConnection;
begin
  conn:=TADOConnection.Create(nil);
  try
    conn.ConnectionString:=ADODB.PromptDataSource(0, '');  // у меня получилось 'Provider=MSDASQL.1;Persist Security Info=False;Data Source=Test'

    sp:=TADOStoredProc.Create(nil);
    try
      sp.Connection:=conn;

      sp.ProcedureName:='spSomeProc1';
      sp.Parameters.Refresh;
      sp.Parameters.ParamByName('Param').Value:=1;
      sp.Open;
      try
      finally
        sp.Close;
      end;

      sp.ProcedureName:='spSomeProc2';
      sp.Parameters.Refresh;
      sp.Open;
      try
      finally
        sp.Close;
      end;
    finally
      sp.Free;
    end;
  finally
    conn.Free;
  end;
end;


Это сообщение отредактировал(а) kami - 3.12.2013, 21:15
PM MAIL WWW   Вверх
Frees
Дата 4.12.2013, 06:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



MySQL у меня нет, пробовал на Firebird через ODBC, на Delphi XE3.

Conn - создавал в дизайне.
в твоем коде не хватает  conn.Connected := True;

Ошибок не видел.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
kami
Дата 4.12.2013, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Цитата(Frees @  4.12.2013,  06:38 Найти цитируемый пост)
в твоем коде не хватает  conn.Connected := True;

Оно автоматом выставится при первом sp.Open.

Цитата(Frees @  4.12.2013,  06:38 Найти цитируемый пост)
Ошибок не видел.

Тогда - одно из двух. Либо мускул и его ODBC, либо Delphi 2010... (надеюсь, третье - кривые руки можно исключить). С Delphi и мускула я не слезу, так что... оставим всё как есть, благо это исключение вылезает только при отладке, даже не влияя на дальнейшее выполнение кода, правда - что происходит с самими параметрами при этом - не выяснял...

Это сообщение отредактировал(а) kami - 4.12.2013, 08:45
PM MAIL WWW   Вверх
Frees
Дата 4.12.2013, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Цитата(kami @  4.12.2013,  11:42 Найти цитируемый пост)
Оно автоматом выставится при первом sp.Open.

Было исключение на Refresh, о том что нет коннекта.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
kami
Дата 4.12.2013, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1806
Регистрация: 25.8.2007
Где: Санкт-Петербург

Репутация: 3
Всего: 72



Цитата(Frees @  4.12.2013,  17:42 Найти цитируемый пост)
Было исключение на Refresh, о том что нет коннекта.

А вот это странно. Ибо (по крайней мере в D2010) в TParameters.Refresh первым делом вызывается Command.SetConnectionFlag(cfParameters, True)и в нем железобетонно (при неактивном соединении) OpenConnection.

Добавлено через 2 минуты и 27 секунд
Да это легко проверить и в дизайнтайм - при любой манипуляции с параметрами, списком полей, при попытке выбрать из списка имя sp или выставить sp.Active - автоматом активируется ADOConnection.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0805 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.