Анимация
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

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