Анимация
JavaScript


Главная  Библионтека 

0 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 [ 92 ] 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146

Private Sub Form Load()

Set Db = Workspaces(0).OpenDatabase("C:\SPORT\TOTEACH.MDB") Проверка наличия в базе данных

запроса с именем "My QD1", и если запрос присутствует, то удаляем его.

For I = 0 To Db.QueryDefs.Count - 1

If Db.QueryDefs(I).Name = "My QD1" Then Db.QueryDefs.Delete "My QD1" Exit For

End If Next I

Мы создаем запрос или, на языке, DAO объект QueryDef и устанавливаем строку соединения.

Set Qd1 = Db.CreateQueryDef("My QD1")

Qd1.Connect = "odbc;dsn=vfp34;" Записываем SQL запрос и устанавливаем свойство ReturnsRecord (Возврат записей) равным Истине, так как наш запрос должен возвращать записи

Qd1.SQL = "SELECT * FROM Account"

Qd1.ReturnsRecords = True В этой части процедуры мы устанавливаем соответствие между полями набора данных, предварительно создав его, и объектами формы, а именно двумя текстовыми полями

Set Rs = Db.OpenRecordset("My Qd1", dbOpenSnapshot)

Me.Text1 = Rs!account

Me.Text2 = Rs!summa

vtext1 = Rs!account

vtext2 = Rs!summa

Me.Text3 = Rs.RecordCount End Sub

Как видно из примера, основное отличие pass-through запросов от остальных запросов - это наличие непустого свойства Connect и установка свойства ReturnRecords.

Если вы отредактируете какое-либо из полей формы, то сможете записать изменения на сервер с помощью pass-through запроса. Такой сложный путь необходим ввиду того, что выборки, получаемые в результате выполнения pass-through запросов, не модифицируемы.

Private Sub Command3 Click()

For I = 0 To Db.QueryDefs.Count - 1

If Db.QueryDefs(I).Name = "My QD2" Then Db.QueryDefs.Delete "My QD2" Exit For End If

Next I

Set Qd2 = Db.CreateQueryDef("My QD2") Qd2.Connect = "odbc;dsn=vfp34;"

Qd2.SQL = "Update account set account=" & Str(Me.Text1) & ", summa = " & Str(Me.Text2) & " where account =" & Str(vtext1) & " and summa = " & Str(vtext2) Qd2.ReturnsRecords = False Qd2.Execute

Set Rs = Db.OpenRecordset("My Qd1", dbOpenSnapshot)

Rs.FindNext "account=" & Str(Me.Text1) & " and summa=" & Str(Me.Text2)

Me.Text3 = Rs.RecordCount

End Sub

Обратите внимание, что свойство ReturnsRecords устанавливается равным False и на обращение к методу Execute объекта QueryDef.

Но основным предназначением использования pass-through запросов все же считается не выборка данных, а запросы определения данных и выполнение хранимых процедур на сервере.

В следующем примере создается таблица на внешнем по отношению к Access источнике данных (Data Source)

Set Qd3= Db.CreateQueryDef("My QD3")

Qd3.Connect = "odbc;dsn=vfp34;"

Qd3.SQL = "CREATE TABLE madebyaccess(field1 c(20))



Qd3.ReturnsRecords = False Qd3.Execute

8.4. Использование ODBC API для доступа к внешним данным

ODBC API - прикладной интерфейс программиста для доступа к функциям ODBC. Структура ODBC была изложена в начале этой главы.

В этом параграфе мы познакомимся с некоторыми функциями ODBC более подробно и рассмотрим примеры использования этих функций для доступа к данным на сервере.

Кодирование с помощью ODBC значительно сложнее, но выигрыш в скорости может быть существенным. Здесь следует отметить, что наибольший выигрыш в производительности достигается при доступе к базам данным ODBC. Если же вы попытаетесь с помощью данного метода улучшить показатели доступа к данным, к которым Access обращается с помощью ISAM -последовательного индексного доступа к данным, то результат будет не столь хорош, как хотелось бы, а иногда и совсем плох.

Для того чтобы воспользоваться функциями ODBC API, их необходимо подключить с помощью команды Declare.

ODBC API объявления

Declare Function oSQLAllocEnv Lib "odbc32.dll"

Alias "SQLAllocEnv" (phenv As Long) As Integer

Declare Function oSQLAllocConnect Lib "odbc32.dll"

Alias "SQLAllocConnect" (ByVal henv As Long, phdbc As Long) As Integer

Declare Function oSQLConnect Lib "odbc32.dll"

Alias "SQLConnect" (ByVal hdbc As Long, ByVal szDSN As String,

ByVal cbDSN As Integer, ByVal szUID As String,

ByVal cbUID As Integer, ByVal szAuthStr As String,

ByVal cbAuthStr As Integer) As Integer

Declare Function oSQLAllocStmt Lib "odbc32.dll"

Alias "SQLAllocStmt" (ByVal hdbc As Long, pHstmt As Long) As Integer

Четыре функции, которые приведены выше, служат для установки указателя для окружения, соединения, утверждения и установления связи с приложением - сервером. Установка указателя с перечисленными объектами - необходимая процедура для дальнейших действий, которые вы планируете совершить, используя соединение, построенное с помощью ODBC API. Причем вызов этих функций должен происходить в том порядке, в каком они перечислены выше. Далее приводится пример использования этих функций для построения процедуры, которая соединит вас с источником данных. Причем вы не связаны рамками Access или Visual Basic, подойдет любой продукт, который поддерживает доступ к функциям, хранящимся в динамически подсоединяемых библиотеках DLL.

Перед использованием этой функции необходимо определить структуру следующего типа (в языках, которые не могут создавать типов, придумайте что-нибудь другое, выход всегда есть):

Type ORecordSet

lngHenv As Long Указатель окружения lngHdbc As Long Указатель соединения lngHstmt As Long Указатель утверждения lngHstmtUpdate As Long Указатель используемый для

изменений и удалений intColumns As Integer Возвращаемые колонки lngRows As Long Возвращаемые записи lngRowCount As Long Число записей для операций

со многими записями lngRowSetSize As Long Размер набора записей

в курсоре lngMaxRows As Long Максимальное число

возвращаемых записей lngMaxWidth As Long Максимальная ширина поля lngCursor As Long Тип курсора lngConcur As Long Тип совпадения EOF As Boolean Указывает конец файла BOF As Boolean Указывает начало файла lngFirstRow As Long Первая запись в курсоре



lngCurrentRow As Long Текущая запись в курсоре lngLastRow As Long Последняя запись в курсоре lngLastSetRow As Long Последняя запись в наборе данных

strCursorName As String Имя курсора intArrayPos As Integer Позиция этого типа в массиве

intRowStatus() As Integer Расширенная информация

о наборе записей strColLabels() As String Текст метки колонки lngColLabels() As Long Длина метки колонки lngDisplaySize() As Long Ширина вывода колонки End Type

Информация о наборе данных или создание переменной типа, который объявлен выше -oRecordSet:

Private mtypODBC As OrecordSet

Помимо этого понадобятся следующие константы: Возможные значения, которые будет возвращать вызов ODBC

Public Const SQL INVALID HANDLE = -2 Public Const SQL ERROR = -1 Public Const SQL SUCCESS = 0

Public Const SQL SUCCESS WITH INFO = 1

Public Const SQL STILL EXECUTING = 2

Public Const SQL NEED DATA = 99 Public Const SQL NO DATA FOUND = 100

Данную функцию необходимо использовать, передавая ей в качестве параметров имя источника данных, идентификатор пользователя и пароля пользователя. Функция должна возвращать ложь или истину.

Function rODBCConnect(strServer As String, strUID As String, strPassword As String) As Integer Dim intRet As Integer Dim strConnOut As String * 256 Dim intConnOut As Integer Dim typOBad As ORecordSet Dim i As Integer

On Error GoTo rODBCConnectErr

rODBCConnect = True

Установка указателя окружения

intRet = oSQLAllocEnv(mtypODBC.lngHenv)

If intRet <<>> SQL SUCCESS Then

Call rODBCErrorInfo(mtypODBC.lngHenv, SQL NULL HDBC,

SQL NULL HSTMT) End If

If intRet << SQL SUCCESS Then

rODBCConnect = False

GoTo rODBCConnectExit End If

Установка указателя соединения

intRet = oSQLAllocConnect(ByVal mtypODBC.lngHenv,

mtypODBC.lngHdbc)

If intRet <<>> SQL SUCCESS Then

Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, SQL NULL HSTMT)

End If

If intRet << SQL SUCCESS Then

rODBCConnect = False

GoTo rODBCConnectExit End If

Соединения с указанным драйвером intRet = oSQLConnect(ByVal mtypODBC.lngHdbc, strServer, Len(strServer), strUID, Len(strUID), strPassword,



0 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 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 [ 92 ] 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146