Анимация
JavaScript
|
Главная Библионтека Len(strPassword)) 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 rODBCConnectExit: Exit Function rODBCConnectErr: MsgBox Err.Number & ": " & Err.Description, vbCritical, "rODBCConnect()" typOBad.intArrayPos = -1 rODBCConnect = False Resume rODBCConnectExit End Function После того как вы установили соединение, вам необходимо установить указатель для утверждения, перед тем как приложение сможет выполнить SQL запрос, как показано в следующем примере: intRet = oSQLAllocStmt(ByVal mtypODBC.lngHdbc, mtypODBC.lngHstmt) К счастью, эту функцию надо выполнять только один раз, так как возвращаемый указатель может использоваться любым количеством соединений. Однако с некоторыми серверами, такими как Microsoft SQL Server, вы должны завершить запрос с указателем утверждением, перед тем как начать выполнение другого запроса. В силу этого, вы не можете разместить указатель другого утверждения без открытия другого соединения к серверу или же вам необходимо подождать, пока текущее выражение не завершит работу. В зависимости от драйвера вы можете иметь возможность выполнять несколько выражений на одном соединении. Используйте функцию SQLGetInfo() для того, чтобы определить, способен ли ваш драйвер выполнять несколько утверждений на одном соединении. Таким образом, мы подошли к процессу выполнения SQL выражения. Для этого мы используем объявление следующей функции: Declare Function oSQLExecDirect Lib "odbc32.dll" Alias "SQLExecDirect" (ByVal hstmt As Long, ByVal szSqlStr As String, ByVal cbSqlStr As Integer) As Integer Теперь мы объявили все функции для открытия доступа к набору данных, хранящихся на сервере. Эта функция может выглядеть следующим образом: Function rODBCOpenRecordset( strSQL As String, lngType As Long) As Boolean Открывает набор данных на источнике данных ODBC Вначале необходимо вызвать ODBCConnect для установки соединения Возвращает true при успешном завершении, false при любой ошибке Dim intRet As Integer Dim i As Integer On Error GoTo rODBCOpenRecordsetErr rODBCOpenRecordset = True Проверка наличия соединения If mtypODBC.lngHdbc = SQL NULL HDBC Then MsgBox "Нет открытых дескрипторов. Нет открытых соединений для открытия наборов данных. " & "Вызовите вначале rODBCOpenRecordset", vbCritical, "rODBCOpenRecordset()" rODBCOpenRecordset = False GoTo rODBCOpenRecordsetExit End If Размещает SQL выражение для использования в других функциях intRet = oSQLAllocStmt(ByVal mtypODBC.lngHdbc, mtypODBC.lngHstmt) If intRet <<>> SQL SUCCESS Then Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, mtypODBC.lngHstmt) End If If intRet << SQL SUCCESS Then rODBCOpenRecordset = False GoTo rODBCOpenRecordsetExit End If Устанавливает некоторые значения в глобальной структуре mtypODBC.BOF = False mtypODBC.EOF = False mtypODBC.lngFirstRow = 0 mtypODBC.lngCurrentRow = 0 mtypODBC.lngLastRow = 0 mtypODBC.lngCursor = SQL CURSOR DYNAMIC If lngType = dbOpenDynaset Then mtypODBC.lngConcur = SQL CONCUR VALUES ElseIf lngType = dbOpenSnapshot Then mtypODBC.lngConcur = SQL CONCUR READ ONLY Else "rODBCOpenRecordset()" rODBCOpenRecordset = False GoTo rODBCOpenRecordsetExit End If mtypODBC.lngRowSetSize = odbcRowsetSize Устанавливает максимальное количество записей mtypODBC.lngMaxRows = odbcMaxRows Устанавливает максимальную ширину поля в этом выражении mtypODBC.lngMaxWidth = odbcMaxWidth intRet = oSQLSetStmtOption(ByVal mtypODBC.lngHstmt, SQL ROWSET SIZE, mtypODBC.lngRowSetSize) If intRet <<>> SQL SUCCESS Then Debug.Print "Сообщение: не можем установить размер набора" Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, mtypODBC.lngHstmt) End If Устанавливает тип курсора для этого выражения intRet = oSQLSetStmtOption(ByVal mtypODBC.lngHstmt, SQL CURSOR TYPE, mtypODBC.lngCursor) If intRet <<>> SQL SUCCESS Then Debug.Print "Сообщение: не можем установить тип курсора" Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, mtypODBC.lngHstmt) End If Устанавливает тип согласования для этого выражения intRet = oSQLSetStmtOption(ByVal mtypODBC.lngHstmt, SQL CONCURRENCY, mtypODBC.lngConcur) If intRet <<>> SQL SUCCESS Then Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, mtypODBC.lngHstmt) End If intRet = oSQLSetStmtOption(ByVal mtypODBC.lngHstmt, SQL MAX ROWS, mtypODBC.lngMaxRows) If intRet <<>> SQL SUCCESS Then Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, mtypODBC.lngHstmt) End If Присваивает имя курсора выражения intRet = oSQLSetCursorName(mtypODBC.lngHstmt, "C1", 2) If intRet <<>> SQL SUCCESS Then Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, mtypODBC.lngHstmt) End If mtypODBC.strCursorName = rODBCGetCursorName() Выполнение SQL выражения intRet = oSQLExecDirect(ByVal mtypODBC.lngHstmt, strSQL, Len(strSQL)) If intRet <<>> SQL SUCCESS Then Call rODBCErrorInfo(mtypODBC.lngHenv, mtypODBC.lngHdbc, mtypODBC.lngHstmt) End If If intRet <<>> SQL SUCCESS And intRet <<>> SQL SUCCESS WITH INFO Then rODBCOpenRecordset = False GoTo rODBCOpenRecordsetExit End If Выводит информацию о колонке intRet = rODBCGetColumnInfo() If Not intRet Then rODBCOpenRecordset = False GoTo rODBCOpenRecordsetExit End If rODBCOpenRecordsetExit: Exit Function rODBCOpenRecordsetErr: MsgBox Err.Number & ": " & Err.Description, vbCritical, "rODBCOpenRecordset()" rODBCOpenRecordset = False Resume rODBCOpenRecordsetExit End Function Как и большинство API, ODBC API активно использует указатели. Указатели используются для ссылок на объекты, с которыми вы работаете. ODBC приложения работают с тремя типами указателей: окружения, соединения и утверждения. Каждое приложение, которое использует ODBC, начинается с размещения одного указателя окружения (устанавливаемого с помощью SQLAllocEnv) и заканчивается освобождением этого указателя (SQLFreeEnv). Указатель окружения - это родительский или главный указатель, с которым непосредственно связаны другие ресурсы ODBC, размещаемые для приложения. Для того чтобы исключить появление незавершенных результатов и освободить указатель SQL выражения, используйте следующее выражение, предварительно объявив функцию с помощью команды Declare: Declare Function oSQLFreeStmt Lib "odbc32.dll" Alias "SQLFreeStmt" (ByVal hstmt As Long, ByVal fOption As Integer) As Integer rc = oSQLFreeStmt (mtypODBC.lngHstmt, SQL CLOSE) Следующие функции служат для освобождения указателя соединения и окружения: Declare Function oSQLFreeConnect Lib "odbc32.dll" Alias "SQLFreeConnect" (ByVal hdbc As Long) As Integer Declare Function oSQLFreeEnv Lib "odbc32.dll" Alias "SQLFreeEnv" (ByVal henv As Long) As Integer Как правило, любой сеанс работы с использованием ODBC API должен заканчиваться вызовом этих функций. Вызывая их из Access или Visual Basic, вы можете оформить это примерно таким образом, как показано в следующем примере ниже описании функции: Function rODBCDisconnect() Отсоединение от источника данных (Data Source) Dim intRet As Integer On Error GoTo rODBCDisconnectErr intRet = oSQLDisconnect(ByVal mtypODBC.lngHdbc) If intRet <<>> SQL SUCCESS Then Call rODBCErrorInfo(mtypODBC.lngHenv, 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 |