Каждый раз, когда я пытаюсь связаться с моей базой данных с помощью хранимых процедур, я получаю это «Невозможно выполнить эту операцию с закрытым набором данных» - PullRequest
1 голос
/ 12 июля 2010

Я работаю над проектом Delphi с базой данных MS SQL Server, я подключил базу данных с компонентами ADOConnection, DataSource и ADOProc из Borland Delphi 7 и добавил следующий код:

procedure TForm1.Button2Click(Sender: TObject);
begin
  ADOStoredProc1.ProcedureName := 'sp_Delete_Clen';
  ADOStoredProc1.Refresh;
  ADOStoredProc1.Parameters.ParamByName('@clenID').Value := Edit6.Text;
  ADOStoredProc1.Active := True;
  ADOStoredProc1.ExecProc;
end;

Компонент Edit6 - это поле для редактирования, в котором содержится идентификатор кортежа, который должен быть удален из базы данных, а ADOStoredProc1 - это хранимая процедура в базе данных, которая принимает 1 параметр (идентификатор, который вы хотите удалить). Проект выполняется без проблем, я даже получил TADOTable и DBGrid, которые загружают информацию из базы данных, но когда я пытаюсь удалить кортеж из базы данных, используя его ID, записанный в EditBox, я получаю эту ошибку: «Невозможно выполнить это операция над закрытым набором данных », и точка останова проекта - это когда приложение пытается добавить значение для параметра« clenID ». Где моя ошибка и как ее исправить?

Ответы [ 2 ]

3 голосов
/ 12 июля 2010

Я думаю, что метод ADOStoredProc1.Refresh здесь не подходит.В этом случае хранимая процедура не возвращает набор результатов.Не могли бы вы оставить это?А также строка ADOStoredProc1.Active: = True.Я предполагаю, что соединение с базой данных открыто.Не могли бы вы также проверить значения коллекции параметров в Инспекторе объектов?

2 голосов
/ 13 июля 2010

Я думаю, что вы хотите вызвать ADOStoredProc1.Parameters.Refresh, а не ADOStoredProc1.Refresh.

Кроме того, вы должны установить Active в True только в том случае, если хранимая процедура SQL Server возвращает набор данных - т.е. результат оператора SELECT.,Установка Active в True аналогична вызову Open.

Если хранимая процедура возвращает только код результата (RETURN n ), используйте ExecProc.

Ни в коем случаеЕсли вы используете ADOStoredProc1.Active := True; и ADOStoredProc1.ExecProc;

В итоге, вы, вероятно, хотите что-то вроде

procedure TForm1.btnDeleteClick(Sender: TObject);
begin
  ADOStoredProc1.ProcedureName := 'sp_Delete_Clen';
  ADOStoredProc1.Parameters.Refresh;  // gets the parameter list from SQL Server
  ADOStoredProc1.Parameters.ParamByName('@clenID').Value := edtID.Text;
  ADOStoredProc1.ExecProc;
end;
...