Анимация
JavaScript
|
Главная Библионтека 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 |