powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рекордсет и ошибки в базе MS SQL
8 сообщений из 8, страница 1 из 1
Рекордсет и ошибки в базе MS SQL
    #39141833
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго.

Коллеги, написал процедуру на акцессе + сторку на ms sql. Access 2010/MS SQL 2012

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
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



подразумевается, что я передам на сервер значение и вернется мне рекордсет, а потом из него одно значение.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
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 (как?) либо оставить как есть, но изменить код акцесса(как)?

Заранее спасибо вам за ответы.
...
Рейтинг: 0 / 0
Рекордсет и ошибки в базе MS SQL
    #39141854
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если мечтаешь обрабатывть ошибки на Аксе, то и обрабатывай на нем:
Как-то так

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Public Function MyDelete(Id Integer) As Integer
On Error GoTo Err_MyDelete
    Dim Dim cnt As New ADODB.Connection,  err As ADODB.Error

    Set cnt = CurrentProject.Connection
    cnt.Execute "delete from tbl_mytable where id = " & Id

    MyDelete = -1

Exit_MyDelete:
    Exit Function

Err_MyDelete:
    For each err in cnt.Errors
        MsgBox err.Description
    Next
    MyDelete = cnt.Errorrs(0).Description
    Resume Exit_MyDelete

End Sub



ЗЫ:
Писал по памяти, могут быть неточности. Но идея, надеюсь, понятна
...
Рейтинг: 0 / 0
Рекордсет и ошибки в базе MS SQL
    #39142921
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rivkin Dmitry,

Нет, это не то. По религиозно-политическим соображением я никогда не работаю с sql сервером напрямую, только через сторки. И плюс у меня DAO. И как показали эксперименты, с ним такое не проходит.
Хотя, может, я и не так экспериментировал.
...
Рейтинг: 0 / 0
Рекордсет и ошибки в базе MS SQL
    #39142926
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Users,

Сам себе отвечаю, если кто-то будет искать. Для DAO надо вот так коллекцию ошибок обрабатывать:


For Each oErr In DBEngine.Errors

Next
...
Рейтинг: 0 / 0
Рекордсет и ошибки в базе MS SQL
    #39142949
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
UsersRivkin Dmitry,

Нет, это не то. По религиозно-политическим соображением я никогда не работаю с sql сервером напрямую, только через сторки. И плюс у меня DAO. И как показали эксперименты, с ним такое не проходит.
Хотя, может, я и не так экспериментировал.
Ну, ежели религиозные соображнгия, тогда продолжай мучаться.
Я, как раз, без всякой религии, исходя из логики (как мне кажется), предпочитаю искать наиболее эффетивные решения. С как можно меньшим количеством заморочек.
...
Рейтинг: 0 / 0
Рекордсет и ошибки в базе MS SQL
    #39144128
Users
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Rivkin Dmitry,

Вот если ты ищешь наиболее эффективное решение при работе с sql сервером - то забудь вообще про прямую работу с таблицами. Только сторки и ничего большего.

Ну, а если "эффетивные" решения - то можно, да, и права юзерам давать на таблицы и забывать про то, что процедуры прекомпилятся и так далее.
...
Рейтинг: 0 / 0
Рекордсет и ошибки в базе MS SQL
    #39149886
Rivkin Dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Users,

Мне кажется, тобою неправильно понято правило недопускать юзера напрямую в базу данных. На твоем же примере, из того куска кода, который приведен в первом топике: весь смысл заморочки заключается только в том, что есть опасность удаления вторичного ключа. Но это означает, что юзеру такие права даны. Он может это делать! Так почему бы не проверить наличие записей под этим ключем любыми другими доступными способами? И не заморачиваться с такими сложными выворотами? Уж простой селект, без возврата конкретных данных, а только на предмет наличия присутствия (или отсутствия точнее) можно делать любому юзеру. Но даже если и это нельзя, то тебе, как супервайзеру можно? А юзер код твой не увидит.
С другой стороны, хочешь-не хочешь, а права юзеру определять надо. И в пределах своих прав он (юзер) вправе делать то, что ему позволяет делать программист. (Под незримым присутствием оного)
...
Рейтинг: 0 / 0
Рекордсет и ошибки в базе MS SQL
    #39150009
Шыфл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Users, религия, говоришь, не позвляет? А ODBCDirect используешь?

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
Public dbsDirect As DAO.Database
Public wrkODBC As Workspace         ' workspace variable used for ODBCDirect workspace
Public conPubs As Connection        ' connection variable used in ODBCDirest workspace
Public qdfDirect As QueryDef

Public Function CreateRMTQueryDEF(ConnectString As String) As Integer
On Error GoTo err1
Set wrkODBC = CreateWorkspace("", "admin", "", dbUseODBC)
    wrkODBC.DefaultCursorDriver = dbUseODBCCursor
    ' Create connection in DirectODBC workspace
    Set conPubs = wrkODBC.OpenConnection("Connect1", dbDriverNoPrompt, , "ODBC;" & ConnectString)
    Set dbsDirect = conPubs.Database
    dbsDirect.QueryTimeout = 0
    
    ' Create queryDef in DirectODBC workspace
    Set qdfDirect = conPubs.CreateQueryDef("NQD")
    qdfDirect.Prepare = dbQUnprepare

    addErrorMessage qd, "Connected", "0", 0
    CreateRMTQueryDEF = RMT_SUCCESS
    Exit Function
err1:
    CreateRMTQueryDEF = RMT_ERROR
End Function


...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Microsoft Access [игнор отключен] [закрыт для гостей] / Рекордсет и ошибки в базе MS SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]