Шаг 70 - Метод Execute

Описание
Выполняет запрос на изменение или инструкцию SQL для указанного объекта Connection или Database.

объект.Execute источник, параметры
запрос.Execute параметры

Параметры
объект
Объектная переменная, представляющая объект Connection или Database, для которого будет выполнен запрос.
запрос
Объектная переменная, представляющая объект QueryDef, свойство SQL которого содержит выполняемую инструкцию SQL.
источник
Выражение или переменная типа String, содержащая инструкцию SQL или значение свойства Name объекта QueryDef.
параметры
Необязательный. Константа или комбинация констант, определяющая характеристики целостности данных, как описано в разделе "Значения".

Замечания
Метод Execute определен только для запросов на изменение. При попытке применить метод Execute к запросу другого типа возникает ошибка. Поскольку запрос на изменение не возвращают записей, при вызове метода Execute Recordset объект не возвращается. (Выполнение запроса к серверу SQL в рабочей области ODBCDirect не приводит к возвращению ошибки в случае, когда объект Recordset не возвращается).
Свойство RecordsAffected объекта Connection, Database или QueryDef позволяет определить число записей, измененных в результате последнего вызова метода Execute. Например, в свойстве RecordsAffected регистрируется число записей, удаленных, обновленных или вставленных при выполнении запроса на изменение. При запуске объекта Querydef с помощью метода Execute число измененных записей регистрируется в свойстве RecordsAffected объекта Querydef.
В рабочей области ядра Microsoft Jet при правильном синтаксисе инструкции SQL и подходящих разрешениях метод Execute никогда не приводит к ошибке — даже если не удается изменить или удалить ни одну из записей. Поэтому всегда следует использовать параметр dbFailOnError при запуске с помощью метода Execute запроса на обновление или удаление записей. Данный параметр задает генерирование ошибки выполнения и позволяет отменить все успешно проведенные изменения, если какие-либо из записей оказались заблокированными и не допускают изменения или удаления.
Для достижения максимальной производительности в рабочей области Microsoft Jet, особенно в многопользовательской среде, следует применять вложенные в транзакции вызовы метода Execute. Сначала следует применить метод BeginTrans к текущему объекту Workspace, затем вызвать метод Execute, после чего завершить транзакцию с помощью метода CommitTrans объекта Workspace. Такая последовательность позволяет сохранить изменения на диске и обеспечивает снятие любых блокировок, которые могли быть установлены во время выполнения запроса.
В рабочей области ODBCDirect необязательная константа dbRunAsync задает выполнение запроса в асинхронном режиме. Для того чтобы определить, выполняется ли в данный момент запрос в асинхронном режиме, следует проверить значение свойства StillExecuting объекта, для которого был вызван метод Execute. Чтобы прекратить выполнение метода Execute, вызванного в асинхронном режиме, следует использовать метод Cancel method.

Пример
Следующая программа демонстрирует метод Execute при запуске объектов QueryDef и Database. Для выполнения этой процедуры требуются процедуры ExecuteQueryDef и PrintOutput.

Sub ExecuteX()

	Dim dbsNorthwind As Database
	Dim strSQLChange As String
	Dim strSQLRestore As String
	Dim qdfChange As QueryDef
	Dim rstEmployees As Recordset
	Dim errLoop As Error

	' Определяет две инструкции SQL для запросов на изменение.
	strSQLChange = "UPDATE Сотрудники SET Страна = " & "'United States' WHERE Страна = 'USA'"
	strSQLRestore = "UPDATE Сотрудники SET Страна = " & "'USA' WHERE Страна = 'United States'"
	Set dbsNorthwind = OpenDatabase("Борей.mdb")

	' Создает временный объект QueryDef.
	Set qdfChange = dbsNorthwind.CreateQueryDef("", strSQLChange)
	Set rstEmployees = dbsNorthwind.OpenRecordset( 	"SELECT Фамилия, Страна FROM Сотрудники", dbOpenForwardOnly)

	' Печатает отчет по исходным данным.
	Debug.Print "Данные в таблице 'Сотрудники' до выполнения запроса"
	PrintOutput rstEmployees
	
	' Запускает временный объект QueryDef.
	ExecuteQueryDef qdfChange, rstEmployees
	
	' Печатает отчет по новым данным.
	Debug.Print "Данные в таблице 'Сотрудники' после выполнения запроса"
	PrintOutput rstEmployees

	' Запускает запрос на изменение для восстановления данных. 
	' Перехватывает ошибки, проверяя семейство Errors.
	On Error GoTo Err_Execute
	dbsNorthwind.Execute strSQLRestore, dbFailOnError
	On Error GoTo 0

	' Загружает текущие данные с помощью повторного запроса.
	rstEmployees.Requery

	' Печатает отчет по восстановленным данным.
	Debug.Print "Данные после выполнения запроса, " & "восстанавливающего исходные сведения"
	PrintOutput rstEmployees
	rstEmployees.Close
	
	Exit Sub
	
Err_Execute:

	' Уведомляет пользователя об ошибках, возникших
	' при выполнении запроса.
	If DBEngine.Errors.Count > 0 Then
		For Each errLoop In DBEngine.Errors
			MsgBox "Код ошибки: " & errLoop.Number & vbCr & errLoop.Description
		Next errLoop
	End If
	
	Resume Next

End Sub

Sub ExecuteQueryDef(qdfTemp As QueryDef, rstTemp As Recordset)

	Dim errLoop As Error
	
	' Запускает указанный объект QueryDef. 
	' Перехватывает ошибки, проверяя семейство Errors.
	On Error GoTo Err_Execute
	qdfTemp.Execute dbFailOnError
	On Error GoTo 0
	' Загружает текущие данные с помощью повторного запроса.
	rstTemp.Requery
	
	Exit Sub

Err_Execute:

	' Уведомляет пользователя об ошибках, возникших
	' при выполнении запроса.
	If DBEngine.Errors.Count > 0 Then
		For Each errLoop In DBEngine.Errors
		MsgBox "Код ошибки: " & errLoop.Number & vbCr & errLoop.Description
		Next errLoop
	End If
	
	Resume Next

End Sub

Sub PrintOutput(rstTemp As Recordset)

	' Отображает объект Recordset.
	Do While Not rstTemp.EOF
		Debug.Print "    " & rstTemp!Фамилия & 	", " & rstTemp!Страна
		rstTemp.MoveNext
	Loop

End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 13.03.2002