2013-12-05 3 views
2

У меня есть хранимая процедура, которую я вызываю, чтобы вставлять элементы в таблицу. Если он только вставляет элемент в таблицу, я получаю исключение «Операция прервана». Если я добавлю выбор после вставки, он отлично работает.Проблемы с сохраненной процедурой

Что мне нужно делать по-другому, поэтому я не получаю исключения только с вставкой?

Delphi код

procedure AddItem(dbCon : TADOConnection; sourcePath : String); 
var 
    addProc : TADOStoredProc; 


begin 
    if FileExists(sourcePath) then 
    begin 
    try 
     addProc := TADOStoredProc.Create(nil); 
     addProc.Connection := dbCon; 
     addProc.ProcedureName := 'spTest'; 
     addProc.Open; 

    finally 
     addProc.Free(); 
    end; 
    end; 
end; 

хранимых процедур

ALTER PROCEDURE [dbo].[spTest] 
AS 
BEGIN 
    INSERT INTO dbo.ToSolve (Data, SolveStatus) 
    VALUES (null, 1) 

    --SELECT * from dbo.ToSolve --I must have a select or I get and exception 
END 
+0

Я не эксперт Delphi, но для баз данных обычно требуется код для COMMIT транзакции после того, как она выполнила свою работу. Попробуйте найти в Delphi insert commit, чтобы просмотреть, как это сделать в Delphi. –

ответ

3

Как выяснилось, TADOStoredProc.Open используется в тех случаях, где есть набор записей возвращается. Используйте TADOStoredProc.ExecProc, если наборы записей не возвращены. То же самое касается TADOQuery. Используйте ExecSQL для INSERT/UPDATE/DELETE заявления и Open за SELECT заявления. Итак, ваш пример должен быть таким:

procedure AddItem(dbCon : TADOConnection; sourcePath : String); 

var 
    addProc : TADOStoredProc; 

begin 
    if FileExists(sourcePath) then 
    begin 
    addProc := TADOStoredProc.Create(nil); 
    try 
     addProc.Connection := dbCon; 
     addProc.ProcedureName := 'spTest'; 
     addProc.ExecProc;  
    finally 
     addProc.Free; 
    end; 
    end; 
end; 
+0

Спасибо, что сработал, я только что скопировал и наклеил пример хранимой процедуры. – runfastman

Смежные вопросы