-Поиск по дневнику

Поиск сообщений в rss_sql_ru_access_programming

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 16.03.2006
Записей:
Комментариев:
Написано: 4


Рекордсет и ошибки в базе MS SQL

Понедельник, 04 Января 2016 г. 05:51 + в цитатник
Доброго.

Коллеги, написал процедуру на акцессе + сторку на 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 (как?) либо оставить как есть, но изменить код акцесса(как)?

Заранее спасибо вам за ответы.

http://www.sql.ru/forum/1193785/rekordset-i-oshibki-v-baze-ms-sql


 

Добавить комментарий:
Текст комментария: смайлики

Проверка орфографии: (найти ошибки)

Прикрепить картинку:

 Переводить URL в ссылку
 Подписаться на комментарии
 Подписать картинку