|
Программирование >> Разработка пользовательского интерфейса
ByVal Hwnd As Long, ByVal szConnStrIn As String, ByVal cbConnStrIn As Integer, ByVal szConnStrOut As String, ByVal cbConnStrOutMax As Integer, pcbConnStrOut As Integer, ByVal fDriverCompletion As Integer) As Integer Declare Function oSQLError Lib odbc32.dll Alias SQLError (ByVal henv As Long, ByVal hdbc As Long, ByVal hstmt As Long, ByVal szSqlState As String, pfNativeError As Long, ByVal szErrorMessage As String, ByVal cbErrorMsgMax As Integer, pcErrorMsg As Integer) As Integer Объявленная выше последняя функция служит для обработки ошибок, которые могут возникнуть и возникают при использовании ODBC API. ODBC поддерживает стандартную модель обработки ошибок. Каждая функция ODBC возвращает некий код, одним из которых может быть SQL ERROR. Чтобы получить больше информации об ошибке, приложение вызывает функцию SQLError(). Драйвер хранит информацию об ошибке в структурах henv, hdbc и hstmt и возвращает эту информацию приложению, когда приложение вызывает SQLError(). Каждая функция может вызвать ноль или больше ошибок. Приложение обычно вызывает функцию SQLError(), когда предыдущий вызов ODBC функции возвращает SQL ERROR или SQL SUCCESS WITH INFO. Приложение может тем не менее вызвать SQLError() после вызова любой ODBC функции. Функция SQLError() возвращает следующую информацию: SQLSTATE - стандартный идентификатор ошибки. Native Error Code - код ошибки, свойственный данному источнику данных. Error Message Text - описание ошибки. Ошибки сохраняются для текущего указателя до тех пор, пока данный указатель не будет использован в вызове следующей функции. К примеру, ошибки на hstmt для текущей функции очищаются, как только другая функция будет выполнена с использованием такого же указателя. Ошибки, хранимые для данного указателя, никогда не очищаются в результате вызова функции с использованием указателя другого, хотя и родственного типа. Например, ошибки на hdbc не очищаются, когда вызов делается к родственной hstmt. Функция SQLError() возвращает ошибку из структуры, связанной с самым правым ненулевым аргументом указателя. Приложение запрашивает информацию об ошибке в следующем порядке: Чтобы получить ошибки, связанные с окружением, приложение передает соответствующий henv и включает SQL NULL HDBC и SQL NULL HSTMT в hdbc и hstmt соответственно. Драйвер возвращает статус ошибки ODBC функции, вызываемой самой последней с тем же самым henv. Для вывода ошибок, связанных с соединением, приложение передает соответствующий hdbc плюс hstmt, равный SQL NULL HSTMT. В таком случае драйвер игнорирует аргумент henv. Драйвер возвращает статус ошибки функции ODBC, вызванной самой последней с hdbc. Для отслеживания ошибок, связанных с выражением, приложение передает соответствующий указатель hstmt. Если вызов SQLError() содержит правильный указатель hstmt, драйвер игнорирует аргументы hdbc и henv. Драйвер возвращает статус ошибки самой последней функции ODBC, вызванной с указателем hstmt. Для отслеживания нескольких ошибок, вызываемых функцией, приложение обращается к SQLError() несколько раз. Для каждой ошибки драйвер возвращает SQL SUCCESS и удаляет эту ошибку из списка доступных ошибок. Когда отсутствует дополнительная информация по самому правому ненулевому указателю, функция SQLError() возвращает SQL NO DATA FOUND. Declare Function oSQLExtendedFetch Lib odbc32.dll Alias SQLExtendedFetch (ByVal hstmt As Long, ByVal fFetchType As Long, ByVal irow As Integer, pcrow As Long, rgfRowStatus As Integer) As Integer Declare Function oSQLFetch Lib odbc32.dll Alias SQLFetch (ByVal hstmt As Long) As Integer Declare Function oSQLGetCursorName Lib odbc32.dll Alias SQLGetCursorName (ByVal hstmt As Long, ByVal szCursor As String, ByVal cbCursorMax As Integer, pcbCursor As Integer) As Integer Declare Function oSQLGetData Lib odbc32.dll Alias SQLGetData (ByVal hstmt As Long, ByVal icol As Integer, ByVal fCType As Integer, rgbValue As Any, ByVal cbValueMax As Long, pcbValue As Long) As Integer Declare Function oSQLGetInfo Lib odbc32.dll Alias SQLGetInfo (ByVal hdbc As Long, ByVal fInfoType As Integer, ByRef rgbInfoValue As Any, ByVal cbInfoMax As Integer, cbInfoOut As Integer) As Integer Declare Function oSQLGetStmtOption Lib odbc32.dll Alias SQLGetStmtOption (ByVal hstmt As Long, ByVal fOption As Integer, pvparam As Any) As Integer Declare Function oSQLNumResultCols Lib odbc32.dll Alias SQLNumResultCols (ByVal hstmt As Long, pccol As Integer) As Integer Declare Function oSQLSetCursorName Lib odbc32.dll Alias SQLSetCursorName (ByVal hstmt As Long, ByVal szCursor As String, ByVal cbCursor As Integer) As Integer Declare Function oSQLSetPos Lib odbc32.dll Alias SQLSetPos (ByVal hstmt As Long, ByVal irow As Integer, ByVal fOption As Integer, ByVal fLock As Integer) As Integer Declare Function oSQLSetStmtOption Lib odbc32.dll Alias SQLSetStmtOption (ByVal hstmt As Long, ByVal fOption As Integer, ByVal bparam As Long) As Integer 8.5. Remote Data Objects Технология Remote Data Objects (RDO) - объекты для доступа к внешним данным - доступна, если на компьютере установлена версия Visual Basic 4.0 Entreprise. Очень мало, а в некоторых случаях и совсем не уступающая по скорости доступа к данным, по отношению к прямому использованию ODBC API, данная технология значительно проще в использовании. Особенно тем, кто знаком с DAO - набором объектов для доступа к данным. В этом параграфе мы рассмотрим практические вопросы использования технологии RDO в приложении клиент-сервер. RDO представляет собой тонкую прослойку кода над ODBC API и менеджером драйверов, которая устанавливает соединения, создает наборы данных и курсоры, выполняет другие сложные процедуры, требуя минимума ресурсов рабочей станции, так как все процессы происходят на сервере. Есть определенные различия при визуальной работе с RDO в Visual Basic и Access. В Visual Basic у вас есть возможность воспользоваться элементом управления ActiveX - RemoteControl, который еще в большей степени скрывает сложность работы с внешними данными. Вам достаточно установить лишь несколько свойств этого объекта, и вы получаете доступ к необходимой информации. Используя RDO или объект RemoteControl, вы обходите процессор данных. При этом вы можете иметь доступ к внешним данным любого формата, хотя лучше использовать метод для доступа к данным на сервере таких баз данных, как MS SQL Server или Oracle. При работе с RDO вы можете использовать как синхронный, так и асинхронные процессы, поэтому при большой выборке данных с сервера ваше приложение не будет блокировано на период получения данных. В табл. 8.7 приводятся эквиваленты объектов DAO для объектов RDO. RDO оперирует понятиями строка , а не запись и колонка , а не поле . Так же как DAO, все объекты в RDO содержатся в коллекциях, исключение составляет только rdoEngine. Иерархия объектов RDO приведена на рис. 8.13. Когда RDO инициализируется в первый раз, то создается экземпляр объекта rdoEngine и коллекция rdoEnvirinments, состоящая из одного объекта rdoEnvironments(0).
idoCcnrection I- idoTabIc -\ rdQPncpar::dEtalv:rrcrit Ц rdoRcsultsct H r(,HgCi;>lurnn Ч rdtCQl Ч rdoPa-Ei meter Рис. 8.13. Для установки связи с источником данных ODBC и необходимой базой данных необходимо создать объект rdoConnection. Если у вас нет необходимого источника данных, то вы можете создать его с помощью метода rdoRegisterDataSource или с помощью диалоговых средств Администратора ODBC. Таблица 8.7. Соответствие объектов RDO объектам DAO Объект RDO rdoEngine Отсутствует rdoEnvironment rdoConnection rdoTable Отсутствует rdoResultset Forward-only - type rdoColumn rdoPreparedStatement Эквивалентный объект DAO DBEngine User, Group Workspace Database TableDef Index Recordset Похоже на Forward-Only Snapshot Field QueryDef Существует два подхода к выполнению запросов и созданию результирующего набора данных: Использование запроса, который будет применяться только один раз. В этом случае воспользуйтесь методами OpenResulset или Execute, выполняющими SQL запрос для существующего объекта rdoConnection и создающими объект rdoResultset или выполняющими запрос действия. Использование запроса, который будет применяться неоднократно и дополнительно может иметь параметры. Воспользуйтесь методом CreatePreparedStatement для создания объекта rdoPreparedStatement, который может использоваться в любое время, когда он снова понадобится и для которого можно изменять значения параметров перед каждым повторным использованием. После того как объект rdoPreparedStatement будет создан, используйте методы OpenResultset и Execute с объектом rdoPreparedStatement, для того чтобы создать объект rdoResulset или выполнить запрос действия. Для того чтобы изменить параметры, используйте установки объекта rdoParameter. Используя аргументы метода OpenResultset или свойства объекта rdoPreparedStatement, вы можете установить тип курсора и другие атрибуты объекта rdoResultset. Перед тем как начать работать с RDO, необходимо, используя команду References меню Tools, подключить объекты RDO к вашему проекту. В списке доступных объектов они так и будут называться - Microsoft Remote Data Object. Если вы работаете в Access, то достаточно наличия этих объектов на компьютере, но, как указывалось выше, для этого необходимо установить Visual Basic Entreprise Edition. После того как эти условия выполнены, вы можете свободно обращаться ко всем методам и свойствам этих объектов. Самым верхним в иерархии объектов является rdoEngine. Вспомните об объекте dbEngine из DAO. С помощью следующей строчки вы уже обращаетесь к RDO:
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |