Доброго.
Коллеги, написал процедуру на акцессе + сторку на ms sql. Access 2010/MS SQL 2012
Public Function openSingleValue(ByVal QueryText As String, ByVal FieldName As String) As Variant
Dim rslt As Variant
Dim rst As Recordset
Set rst = OpenRecordset(QueryText)
If rst.RecordCount > 0 Then
rslt = rst.Fields(FieldName).Value
End If
rst.Close
openSingleValue = rslt
End Function
Public Function OpenRecordset(QueryText As String) As DAO.Recordset
On Error GoTo err
'переопределил текст запроса
'создал временный кверидеф
Dim qdf As QueryDef
Set qdf = CreateTempQueryDef(QueryText)
'собственно открыл рекорсет
Set OpenRecordset = qdf.OpenRecordset(dbOpenForwardOnly, dbReadOnly)
qdf.Close
Exit Function
err:
MsgBox "Error connection SQL server", vbInformation
qdf.Close
End Function
подразумевается, что я передам на сервер значение и вернется мне рекордсет, а потом из него одно значение.
CREATE PROC [dbo].[p_myproc_delete](@id INT)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @Row_Count INT;
DECLARE @Error_Code INT;
SET XACT_ABORT OFF;
DELETE
FROM tbl_mytable
WHERE id = @id;
SELECT @Row_Count = @@ROWCOUNT, @Error_Code = @@ERROR
IF (@Error_Code <> 0) OR (@Row_Count <> 1)
BEGIN
IF @Error_Code = 547 -- существует foreight key
BEGIN
RETURN (-400); -- ошибка - есть ссылка
END
ELSE
BEGIN
RETURN (-300); -- ошибка при удалении
END
END;
ELSE
BEGIN
RETURN @id;
END;
END;
declare @ret int; exec @ret = dbo.p_myproc_delete @id =2; select @ret as ret;
И, соответственно, с сервера я получаю через Return коды возврата. И все было хорошо ровно до того, как попался foreingn key.
Я пытаюсь удалять, обрабатываю ошибку 547 и получаю код возврата -400, мечтая обработать его в акцессе.
Однако вместе с ним выдается и ошибка на сервере, Msg 547, Level 16, State 0, Procedure p_myproc_delete, Line 13
The DELETE statement conflicted with the REFERENCE constraint ссылки на мои таблиц
The statement has been terminated.
Как результат - генерится ошибка в моей функции OpenRecordset.
И вот вопрос - как эту ошибку на сервере корректно обрабатывать и где? Либо переписать код на сервере на try - catch (как?) либо оставить как есть, но изменить код акцесса(как)?
Заранее спасибо вам за ответы.