Visual Basic в технологии клиент-сервер ( Пример с SQL Server 7.0)
New Page 2
Применение технологии клиент-сервер MS Access & SQL Server Связь через ODBC.
Интерфейс ODBCDirect При использовании программы-сервера базы данных, например SQL Server, Visual Basic (далее VB) сталкивается с проблемой. Дело в том, что SQL Server работает по технологии клиент-сервер, а VB - файл-сервер. В чем разница: VB считывает все данные и производит запрос самостоятельно.. Серверы баз данных (клиент-сервер) выполняют эту работу сами. Они выполняют операторы SQL и возвращают результат. При файл-серверной технологии VB используя СУБД Jet Engine обрабатывает операторы SQL получает результат и засылает результат обратно на SQL Server. При таком способе теряется время ( а если пользователей много, то много времени) и можно использовать только те команды, которые воспринимает Jet Engine. Эту проблему можно решить отказавшись от использования Jet Engine. Для этого в систему встроен интерфейс ODBCDirect. При использовании этой технологии загрузки модуля Jet Engine не происходит. Это дает выигрыш во времени и занимаемой памяти. Кроме того, в ODBCDirect существует возможность асинхронного выполнения SQL - запросов. Это означает, что программа после передачи оператора SQL не будет ожидать завершения работы операторов SQL, а продолжит работу
Создание наборов записей с помощью ODBCDirect Главное отличие - должен быть создан новый объект Workspace Set object = DBEngine.CreateWorkspace (name, user, password, type) ' где type dbUseODBC, т.е.
Set object = DBEngine.CreateWorkspace (name, user, password, dbUseODBC)
Затем следует установить связь с источником данных , с помощью объекта Database Set db = ws.OpenDatabase ("base", False, False, "ODBC;dsn=SQL; uid=my; pwd=secret")
Однако этот способ не может работать с асинхронным выполнением запросов. Этот способ применяется, если Вы работаете с базами в формате Access.
Объект Connection С помощью Объекта Connection реализуется асинхронное выполнение. Set object = wsob.OpenConnection (name, option , readonly, connection) Где: - name - задает имя объекта, которое будет использоваться для доступа к объекту - option - задает способ запроса драйвером ODBC и следует ли открывать подключение в асинхроном режиме.
Свойство StillExecuting При асинхронной связи можно проверить закончено ли выполнение асинхронной операции
Do While rs.StillExecuting ' Код Loop
А теперь привожу рабочий пример, который используется в моей базе Access для работы с таблицей SQL Server 7.0
Dim wrkODBC As Workspace Dim conPubs As Connection Dim conLoop As Connection Dim rstTemp As Recordset
Set wrkODBC = CreateWorkspace("NewODBCWorkspace", _ "system", "manager", dbUseODBC) Set conPubs = wrkODBC.OpenConnection("Connection1", _ dbDriverNoPrompt, , _ "ODBC;DATABASE=Apteka;UID=;PWD=;DSN=apteka") Set rstTemp = conPubs.OpenRecordset("dbo.выборМ", dbOpenDynaset) rstTemp.MoveFirst Forms!Подключение!Path_MDB = rstTemp![Наименование]
В данном примере Forms!Подключение!Path_MDB бд MS Access97 присваивается значение поля "Наименование" из таблицы "dbo.выборМ" базы SQL Server "Apteka"
Также можно использовать технологию клиент-сервер и с другими базами, например Oracle. Но это уже другая тема