<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AutoIt v3: работа с базой данных Access с помощью ODBC API]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=4040</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=4040&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AutoIt v3: работа с базой данных Access с помощью ODBC API».]]></description>
		<lastBuildDate>Sat, 02 Jan 2010 13:24:14 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AutoIt v3: работа с базой данных Access с помощью ODBC API]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=31970#p31970</link>
			<description><![CDATA[<p><em>Без гарантий. Используете на свой страх и риск.</em></p><p>Подборка темы <a href="http://www.forum.script-coding.com/viewtopic.php?id=161">Работа с базами данных с помощью скриптовых интерфейсов</a>.</p><p>Пример работы с базой Access 4.0 через функции ODBC API в среде AutoIt3. Ведется прямая работа с базой, в обход источника данных.<br /></p><div class="codebox"><pre><code>;---------------------------------------------------------------------------------------------
; Пример работы с базой Access 4.0 через функции ODBC API в среде AutoIt3.
; Ведется прямая работа с базой данных, в обход источника данных.
;---------------------------------------------------------------------------------------------
; Language: AutoIt3
; ODBC 3.51 и выше
; Win 98/Me/XP
;---------------------------------------------------------------------------------------------

Global $INSTALLER
Global $MANAGER
;---------------------------------------------------------------------------------------------
Global Const $SQL_SUCCESS= 0
Global Const $SQL_CLOSE    = 0
Global Const $SQL_DROP    = 1
Global Const $SQL_UNBIND    = 2
Global Const $SQL_RESET_PARAMS = 3
Global Const $SQL_ACCESSIBLE_PROCEDURES = 20
Global Const $ODBC_ADD_SYS_DSN = 4
Global Const $SQL_DRIVER_NOPROMPT = 0
Global Const $SQL_C_CHAR    = 1
Global Const $SQL_FETCH_NEXT = 1
Global Const $SQL_NO_DATA_FOUND = 100

;[Тестовая функция демонстрирующая работу с БД]
;----------------------------------------------------------------------------------
Func AccessSample()

$INSTALLER = DllOpen(&quot;odbccp32.dll&quot;)    ;Открываем библиотеку установщика ODBC
$MANAGER = DllOpen(&quot;odbc32.dll&quot;)    ;Открываем библиотеку менеджера драйверов ODBC

Dim $InitData[2]
$dir=@ScriptDir

;[Создание файла базы данных в каталоге скрипта]
;----------------------------------------------------------------------------------
$InitData[0]    =&quot;Microsoft Access Driver (*.mdb)&quot;    ;Указатель на драйвер
$InitData[1]    =&#039;CREATE_DB=&quot;&#039; &amp; $dir &amp; &#039;\access.mdb&quot;&#039;     ;Указатель на создаваемый файл
  
$result = DllCall($INSTALLER, _
 &quot;short&quot;,&quot;SQLConfigDataSource&quot;, _
 &quot;hwnd&quot;,0, _
 &quot;long&quot;,$ODBC_ADD_SYS_DSN, _
 &quot;str&quot;,    $InitData[0], _
 &quot;str&quot;,    $InitData[1])

Select
 Case $result[0]&lt;&gt;1
MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка:Создание файла базы. Возможно файл уже существует.&quot;)
 Case $result[0]=1
MsgBox (262192,&quot;[Работала API SQLConfigDataSource]&quot;, _
          &quot;[Создание файла базы Access]&quot;    &amp; @CR &amp; _
          &quot;[Результат]&quot;    &amp; @CR &amp; $result[0]    &amp; @CR &amp; _
          &quot;[Драйвер]&quot;    &amp; @CR &amp; $InitData[0]    &amp; @CR &amp; _
          &quot;[Строка инициализации]&quot;  &amp; @CR &amp; $InitData[0])
EndSelect

;[Прямое подключение к базе данных]
;----------------------------------------------------------------------------------
;/Генерация дескриптора окружения/

$HANDLE_BUFFER  = DllStructCreate(&quot;udword&quot;)
$result=DllCall($MANAGER, _
      &quot;short&quot;,&quot;SQLAllocEnv&quot;, _
      &quot;long&quot;,DllStructGetPtr($HANDLE_BUFFER))
      ;-----------------------------------------
      If $result[0]&lt;&gt;$SQL_SUCCESS then
        MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: дескриптор окружения.&quot;)
        return -1
      EndIf
$HANDLE_ENV=DllStructGetData($HANDLE_BUFFER,1)
$HANDLE_BUFFER=0
;---------------------------------------------------------------------------------------------
;/Генерация дескриптора соединения/

$HANDLE_BUFFER  = DllStructCreate(&quot;udword&quot;)
$result=DllCall($MANAGER, _
      &quot;short&quot;,&quot;SQLAllocConnect&quot;, _
      &quot;long&quot;,$HANDLE_ENV, _
      &quot;long&quot;,DllStructGetPtr($HANDLE_BUFFER))
      ;-----------------------------------------
      If $result[0]&lt;&gt;$SQL_SUCCESS then
        MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: дескриптор соединения.&quot;)
        return -1
      EndIf
$HANDLE_CONN=DllStructGetData($HANDLE_BUFFER,1)
$HANDLE_BUFFER=0
;Можно попробовать оставить один буфер на все дескрипторы
;---------------------------------------------------------------------------------------------
;/Строка подключения к драйверу/

$CONNECTION_STRING=  &quot;Driver={Microsoft Access Driver (*.mdb)};&quot; &amp; _  ;Строка драйвера
    &quot;DBQ=&quot; &amp; $dir &amp; &quot;\access.mdb;&quot; &amp; _    ;Путь к файлу базы(этих двух строк достаточно чтобы завести соединение)
    &quot;DefaultDir=C:\TestAccess;&quot; &amp; _    ;Каталог по умолчанию
    &quot;ExtendedAnsiSQL=0;&quot; &amp; _        ;Использовать расширенную грамматику SQL
    &quot;FIL=MS Access;&quot; &amp; _        ;Тип файла источника
    &quot;ImplicitCommitSync=Yes;&quot; &amp; _    ;Параметр ожидания завершения предыдущей внутренней транзакции
    &quot;MaxBufferSize=4096;&quot; &amp; _        ;Размер буфера(kB) кратный 256
    &quot;MaxScanRows=5;&quot; &amp; _        ;Строк сканирования
    &quot;PageTimeout=5;&quot;    &amp; _        ;Время задержки данных в буфере до их сброса в базу(1/10 сек)
    &quot;ReadOnly=0;&quot; &amp; _            ;Режим чтения
    &quot;SafeTransactions=0;&quot; &amp; _        ;Защищенные транзакции
    &quot;Threads=3;&quot; &amp; _            ;Потоков
    &quot;UserCommitSync=Yes&quot;        ;Параметр ожидания завершения предыдущей внешней транзакции
;---------------------------------------------------------------------------------------------
$CONNECTION_STRING_LEN  =StringLen($CONNECTION_STRING)
$SZ_BUFFER_SIZE = 1024    ;Размер буфера строки подключения которую возвращает драйвер(желательно кратно 1024)
$SZ_BUFFER = DllStructCreate(&quot;char[&quot; &amp; $SZ_BUFFER_SIZE &amp; &quot;]&quot;)
$LENGHT = DllStructCreate(&quot;udword&quot;)
;---------------------------------------------------------------------------------------------
;/Соединение с базой данных/

$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLDriverConnectW&quot;, _
    &quot;long&quot;,  $HANDLE_CONN, _
    &quot;long&quot;,  0, _
    &quot;wstr&quot;,  $CONNECTION_STRING, _
    &quot;long&quot;,  $CONNECTION_STRING_LEN, _
    &quot;wstr&quot;,  DllStructGetPtr($SZ_BUFFER), _
    &quot;long&quot;,  $SZ_BUFFER_SIZE, _
    &quot;long&quot;,  DllStructGetPtr($LENGHT), _
    &quot;long&quot;,   $SQL_DRIVER_NOPROMPT)
    ;-----------------------------------------------------------------------------------------
    Select
    Case $result[0]&lt;&gt;$SQL_SUCCESS 
        MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: Соединение.&quot;)
        return -1
    Case $result[0]=$SQL_SUCCESS
      $Str1=StringReplace($CONNECTION_STRING,&quot;;&quot;,&quot;;&quot; &amp; @CR)
      $Str2=StringReplace($result[5],&quot;;&quot;,&quot;;&quot; &amp; @CR)
        MsgBox (262192,&quot;[Работала API SQLDriverConnectW]&quot;, _
          &quot;[Прямое подключение к драйверу]&quot; &amp; @CR &amp; _
          &quot;[Результат]&quot; &amp; @CR &amp; $result[0] &amp; @CR &amp; _
          &quot;[Строка инициализации]&quot; &amp; @CR &amp; $Str1  &amp; @CR &amp; _
          &quot;[Строка подключения сгенерированная драйвером]&quot; &amp; @CR &amp; $Str2 &amp; @CR &amp; _
          &quot;[Дескриптор окружения]&quot; &amp; @CR &amp; $HANDLE_ENV  &amp; @CR &amp; _
          &quot;[Дескриптор соединения]&quot;  &amp; @CR &amp; $HANDLE_CONN)
    EndSelect        
    ;-----------------------------------------------------------------------------------------
    $CONNECTION_STRING=$result[5]
    $SZ_BUFFER=0
    $LENGHT=0

;[Функция SQLGetInfo позволяет получать разнообразную информацию ODBC технического плана]
;[Подробнее о запросах и возвращаемых значениях см.справку ODBC]
;---------------------------------------------------------------------------------------------
  $SZ_BUFFER_SIZE  =1024
  $SZ_BUFFER  = DllStructCreate(&quot;char[&quot; &amp; $SZ_BUFFER_SIZE &amp; &quot;]&quot;)
  $LENGHT    = DllStructCreate(&quot;long&quot;)
;---------------------------------------------------------------------------------------------
$result=DllCall($MANAGER, _
        &quot;short&quot;,&quot;SQLGetInfo&quot;, _
        &quot;long&quot; ,$HANDLE_CONN, _
        &quot;long&quot; ,$SQL_ACCESSIBLE_PROCEDURES, _
        &quot;long&quot; ,DllStructGetPtr($SZ_BUFFER), _
        &quot;long&quot; ,$SZ_BUFFER_SIZE, _
        &quot;long&quot; ,DllStructGetPtr($LENGHT))
    ;----------------------------------------------------------------------------------------
    Select
    Case $result[0]&lt;&gt;$SQL_SUCCESS
      MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: Получение информации.&quot;)
    Case $result[0]=$SQL_SUCCESS
    ;----------------------------------------------------------------------------------------
      $DATA=DllStructGetData($SZ_BUFFER,1)
    ;-----------------------------------------------------------------------------------------
      MsgBox (262192,&quot;[Работала API SQLGetInfo]&quot;, _
          &quot;[Получение информации]&quot;   &amp; @CR &amp; _
          &quot;[Результат]&quot;    &amp; @CR &amp; $result[0] &amp; @CR &amp; _
          &quot;[Указатель запроса]&quot;  &amp; @CR &amp; $result[2] &amp; @CR &amp; _
          &quot;[Возвращенные данные]&quot;  &amp; @CR &amp; $DATA)
    EndSelect
;---------------------------------------------------------------------------------------------
$HANDLE_STMT=GenerateStmt(0,0,1,$HANDLE_CONN,0)    ;Генерация операторного дескриптора
    If $HANDLE_STMT=-1 then return 0

;[Создание таблиц,добавление и чтение данных]
;---------------------------------------------------------------------------------------------
;/Создание таблицы/

$SQL_COMMAND=&quot;CREATE TABLE TESTTABLE(col1 varchar,col2 varchar)&quot;
StaticSQLStatement($SQL_COMMAND,$HANDLE_STMT)
$HANDLE_STMT=GenerateStmt(1,$SQL_RESET_PARAMS,1,$HANDLE_CONN,$HANDLE_STMT)     ;регенерация операторного дескриптора
If $HANDLE_STMT=-1 then return 0
;---------------------------------------------------------------------------------------------
;/Добавление данных/

$SQL_COMMAND=&quot;INSERT INTO TESTTABLE VALUES(&#039;This Is Access 4.0&#039;,&#039; database&#039;)&quot;
StaticSQLStatement($SQL_COMMAND,$HANDLE_STMT)
$HANDLE_STMT=GenerateStmt(1,$SQL_RESET_PARAMS,1,$HANDLE_CONN,$HANDLE_STMT)     ;регенерация операторного дескриптора
If $HANDLE_STMT=-1 then return 0
;---------------------------------------------------------------------------------------------
;/Чтение данных/

$SQL_COMMAND=&quot;SELECT * FROM TESTTABLE&quot;
StaticSQLStatement($SQL_COMMAND,$HANDLE_STMT)
$ColumnsCount=ColCount($HANDLE_STMT)
$DATA=QuerySQLStatement($ColumnsCount,$HANDLE_STMT)
$DATA=StringReplace($DATA,&quot;^&quot;,&quot;;&quot; &amp; @CR)
MsgBox (262192,&quot;[Выборка массива данных]&quot;,&quot;[Возвращенные данные]&quot; &amp; @CR &amp; $DATA)
$HANDLE_STMT=GenerateStmt(1,$SQL_RESET_PARAMS,1,$HANDLE_CONN,$HANDLE_STMT)     ;регенерация операторного дескриптора


;[Освобождение ресурсов]
;---------------------------------------------------------------------------------------------
;/Освобождение операторного дескриптора/

$HANDLE_STMT=GenerateStmt(1,$SQL_DROP,0,0,$HANDLE_STMT)    
;------------------------------------------------------------------------
;/Завершение сеанса подключения/

$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLDisconnect&quot;, _
             &quot;long&quot;,$HANDLE_CONN)
;------------------------------------------------------------------------
;/Освобождение дескриптора соединения/

$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLFreeConnect&quot;, _
       &quot;long&quot;,$HANDLE_CONN)        
;------------------------------------------------------------------------
;/Освобождение дескриптора окружения/

$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLFreeEnv&quot;, _
       &quot;long&quot;,$HANDLE_ENV)
;---------------------------------------------------------------------------------------------
;Зарытие Dll
DllClose($MANAGER)
DllClose($INSTALLER)

MsgBox (262192,&quot;[Завершено]&quot;, _
      &quot;[Демонстрационный скрипт завершен]&quot;)
EndFunc

;[Генерация,обновление,освобождение операторного дескриптора]
;---------------------------------------------------------------------------------------------
Func GenerateStmt($Free, _      ;Освобождать операторный дескриптор
                $Method, _    ;Указатель на способ освобождения операторного дескриптора
                $Generate, _    ;Генерировать операторный дескриптор
                $ConnHnd, _    ;Дескриптор соединения
                $StmtHnd)    ;Операторный дескриптор предыдущего состояния.Предусмотрен в параметрах вызова на случай множественных подключений.

;Дескриптор требуется обновлять после каждого запроса
;---------------------------------------------------------------------------------------------
If $Free=True then
;Освобождение операторного дескриптора
$result=DllCall($MANAGER, _
    &quot;short&quot;,&quot;SQLFreeStmt&quot;, _
    &quot;long&quot;,$StmtHnd, _        
    &quot;long&quot;,$SQL_DROP)  
EndIf
;---------------------------------------------------------------------------------------------
If $Generate=True then
;Генерация операторного дескриптора
$HANDLE_BUFFER  = DllStructCreate(&quot;udword&quot;)
$result=DllCall($MANAGER, _
      &quot;short&quot;,&quot;SQLAllocStmt&quot;, _
      &quot;long&quot;,$ConnHnd, _
      &quot;long&quot;,DllStructGetPtr($HANDLE_BUFFER))
      ;-----------------------------------------
      If $result[0]&lt;&gt;$SQL_SUCCESS then
      MsgBox (16,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: генерация операторного дескриптора.&quot;)
        return -1
      EndIf
      ;-----------------------------------------
$HANDLE_STMT=DllStructGetData($HANDLE_BUFFER,1)
$HANDLE_BUFFER=0
return $HANDLE_STMT
EndIf
EndFunc

;[Выполнение статического запроса]
;---------------------------------------------------------------------------------------------
Func StaticSQLStatement($SQL_Command, _  ;Запрос
      $StmtHnd)  ;Операторный дескриптор.Предусмотрен в параметрах вызова на случай множественных подключении

$SQL_COMMAND_LEN=StringLen($SQL_Command)
$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLExecDirectW&quot;, _
    &quot;long&quot;  ,$StmtHnd, _      
    &quot;wstr&quot;  ,$SQL_COMMAND, _      
    &quot;long&quot;  ,$SQL_COMMAND_LEN)
    
    ;-----------------------------------------------------------------------------------------
    Select
    Case $result[0]&lt;&gt;$SQL_SUCCESS
      MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: Выполнение статического запроса.&quot;)
    Case $result[0]=$SQL_SUCCESS
      MsgBox (262192,&quot;[Работала API SQLExecDirectW]&quot;, _
            &quot;[Выполнение статического запроса]&quot; &amp; @CR &amp; _
            &quot;[Результат]&quot;  &amp; @CR &amp; $result[0] &amp; @CR &amp; _
            &quot;[Запрос SQL]&quot;  &amp; @CR &amp; $result[2])
    EndSelect
EndFunc


;[Получение данных набора записей]
;---------------------------------------------------------------------------------------------
Func QuerySQLStatement($ColCount,$StmtHnd)

$SZ_BUFFER_SIZE  = 255
$SZ_BUFFER = DllStructCreate(&quot;char[&quot; &amp; $SZ_BUFFER_SIZE &amp; &quot;]&quot;)
$LENGHT = DllStructCreate(&quot;long&quot;)
$D = &quot;&quot;

While 1
;---------------------------------------------------------------------------------------------
;Переход к следующей строке
$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLFetchScroll&quot;, _
    &quot;long&quot;,  $StmtHnd, _  
    &quot;short&quot;, $SQL_FETCH_NEXT, _
    &quot;int&quot;,     0)      

If $result[0]=$SQL_NO_DATA_FOUND then ExitLoop
;---------------------------------------------------------------------------------------------
;Получение значений набора записей
$DATA=&quot;&quot;
For $i=1 to $ColCount
  $result=DllCall($MANAGER, _
      &quot;short&quot; ,&quot;SQLGetData&quot;, _
      &quot;long&quot; ,$StmtHnd, _            ;Операторный дескриптор
      &quot;long&quot; ,$i, _                ;Номер столбца
      &quot;long&quot; ,$SQL_C_CHAR, _            ;Тип выбираемых данных
      &quot;str&quot; ,DllStructGetPtr($SZ_BUFFER), _    ;Указатель буфера данных
      &quot;long&quot; ,$SZ_BUFFER_SIZE, _        ;Предполагаемый размер строки
      &quot;long&quot; ,DllStructGetPtr($LENGHT))        ;Указатель структуры содержащей реальный размер строки

;---------------------------------------------------------------------------------------------
;Обработка пустого набора записей
If DllStructGetData($LENGHT,1)=-1 then return $SQL_NO_DATA_FOUND
;---------------------------------------------------------------------------------------------
;Обработка возможной ошибки
If $result[0]&lt;&gt;$SQL_SUCCESS then
MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: Выборка данных.&quot;)
EndIf
;---------------------------------------------------------------------------------------------
;Обновление данных структур
  DllStructSetData($LENGHT,1,0)
  DllStructSetData($SZ_BUFFER,1,&quot;&quot;)
;------------------------------------------------
  $DATA=$DATA &amp; $result[4]
Next
;---------------------------------------------------------------------------------------------
$D=$D &amp; $DATA &amp; &quot;^&quot;
Wend
  return $D
EndFunc

;[Подсчет столбцов в наборе записей]
;---------------------------------------------------------------------------------------------
Func ColCount($StmtHnd)
$COUNT  = DllStructCreate(&quot;udword&quot;)
$result=DllCall($MANAGER, _
      &quot;short&quot; ,&quot;SQLNumResultCols&quot;, _
      &quot;long&quot;  ,$StmtHnd, _      ;Операторный дескриптор
      &quot;long&quot;   ,DllStructGetPtr($COUNT))
  ;------------------------------------------------------------------------------------------
  ;Обработка возможной ошибки
  If $result[0]&lt;&gt;$SQL_SUCCESS then
  MsgBox (262192,&quot;Произошла ошибка&quot;, &quot;Произошла ошибка: Счетчик столбцов.&quot;)
  return -1
  EndIf
  ;------------------------------------------------------------------------------------------
$CCOUNT=DllStructGetData($COUNT,1)
MsgBox (262192,&quot;[Работала API SQLNumResultCols]&quot;, _
            &quot;[Подсчет количества столбцов]&quot; &amp; @CR &amp; _
            &quot;[Найдено столбцов]: &quot; &amp; $CCOUNT)
$COUNT=0
return $CCOUNT
EndFunc
;---------------------------------------------------------------------------------------------

AccessSample()  ;Вызов примера
;poltergeyst 2006</code></pre></div><p>Простейший случай обработки ошибки ODBC.<br /></p><div class="codebox"><pre><code>;---------------------------------------------------------------------------------------------
; Простейший случай обработки ошибки ODBC.
;---------------------------------------------------------------------------------------------
; Language: AutoIt3
; ODBC 3.51 и выше
; Win 98/Me/XP
;---------------------------------------------------------------------------------------------

Global $HANDLE_ENV,$HANDLE_CONN,$HANDLE_STMT
Global $odbcRes    ;Результат работы функции
Global Const $GUI_EVENT_CLOSE= -3

;---------------------------------------------------------------------------------------------
$MANAGER=DllOpen(&quot;odbc32.dll&quot;)  
$GUI=GUICreate(&quot;Обработка ошибки&quot;,200,100,-1,-1)  
$B1=GUICtrlCreateButton(&quot;Init ODBC error!&quot;,20,10,160,80)
GUISetState()
;---------------------------------------------------------------------------------------------
While 1
    $msg=GUIGetMsg()
    
    ;/Вызов обработчика ошибки удобно встроить прямо в цикл сообщений./

    If $odbcRes&lt;&gt;0 then
        ODBCError()
        $odbcRes=0
    EndIf  
    
    If $msg = $GUI_EVENT_CLOSE then ExitLoop
    If $msg = $B1 then BadlyFunction()  
Wend

;[Порождающая ошибку функция]
;---------------------------------------------------------------------------------------------
Func BadlyFunction()  

;/Генерация дескриптора окружения/
$HANDLE_BUFFER  = DllStructCreate(&quot;udword&quot;)

;SQLAllocEnv является функцией ODBC 2.0.В целях поддержки совместимости
;включена в более поздние версии ODBC где расширена за счет функции
;SQLAllocHandle с параметром SQL_HANDLE_ENV.

$result=DllCall($MANAGER, _
    &quot;short&quot;,&quot;SQLAllocEnv&quot;, _
    &quot;long&quot;,DllStructGetPtr($HANDLE_BUFFER))

$HANDLE_ENV=DllStructGetData($HANDLE_BUFFER,1)
;---------------------------------------------------------------------------------------------

;/Генерация дескриптора соединения/

;SQLAllocConnect является функцией ODBC 2.0.В целях поддержки совместимости
;включена в более поздние версии ODBC где расширена за счет функции
;SQLAllocHandle с параметром SQL_HANDLE_DBC.

$result=DllCall($MANAGER, _
    &quot;short&quot;,&quot;SQLAllocConnect&quot;, _
    &quot;long&quot;,$HANDLE_ENV, _
    &quot;long&quot;,DllStructGetPtr($HANDLE_BUFFER))

$HANDLE_CONN=DllStructGetData($HANDLE_BUFFER,1)
$HANDLE_BUFFER=0
;---------------------------------------------------------------------------------------------
;/Создание соединения с заведомо несуществующим системным источником данных/

$CONNECTION_STRING=&quot;Damn,i am good...[Duke]&quot;
$CONNECTION_STRING_LEN  =StringLen($CONNECTION_STRING)

$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLConnectW&quot;, _
    &quot;long&quot;,$HANDLE_CONN, _
    &quot;wstr&quot;,$CONNECTION_STRING, _
    &quot;long&quot;,$CONNECTION_STRING_LEN, _
    &quot;wstr&quot;,&quot;&quot;, _
    &quot;long&quot;,0, _
    &quot;wstr&quot;,&quot;&quot;, _
    &quot;long&quot;,0)

$odbcRes=$result[0]
If $odbcRes&lt;&gt;0 Then return -1
EndFunc

;[Обработчик ошибки]
;---------------------------------------------------------------------------------------------
Func ODBCError()

$SZ_BUFFER_SIZE  = 1024  
$ERROSTRUCT= _
DllStructCreate(&quot;char[64];char[&quot; &amp; $SZ_BUFFER_SIZE &amp; &quot;];udword;udword&quot;)

;/Обработчик ошибки/
;SQLErrorW является функцией ODBC 2.0.В целях поддержки совместимости
;включена в более поздние версии ODBC где расширена за счет функций
;SQLGetDiagField и SQLGetDiagRec.

$result=DllCall($MANAGER,&quot;short&quot;,&quot;SQLErrorW&quot;, _
&quot;long&quot;,  $HANDLE_ENV, _    ;Дескриптор окружения
&quot;long&quot;,  $HANDLE_CONN, _    ;Дескриптор соединения
&quot;long&quot;,  $HANDLE_STMT, _    ;Операторный дескриптор
&quot;wstr&quot;,  DllStructGetPtr($ERROSTRUCT,1), _  ;SQL STATE
&quot;long&quot;,  DllStructGetPtr($ERROSTRUCT,3), _  ;Код ошибки
&quot;wstr&quot;,  DllStructGetPtr($ERROSTRUCT,2), _  ;Сообщение об ошибке
&quot;long&quot;,  $SZ_BUFFER_SIZE, _     ;Размер буфера выделяемого под сообщение
&quot;long&quot;,  DllStructGetPtr($ERROSTRUCT,4))  ;Реальная длина буфера

MsgBox (262192,&quot;Произошла ошибка ODBC&quot;, _
    &quot;[SQL STATE]&quot;  &amp; @CR &amp; $result[4] &amp; @CR &amp; _
    &quot;[Описание]&quot;  &amp; @CR &amp; $result[6])
EndFunc</code></pre></div><p>Сжатие базы данных Access с установкой нового пароля доступа с помощью транслятора Microsoft.Jet.OLEDB.4.0 и библиотеки Jet and Replication Objects(JRO). <br /></p><div class="codebox"><pre><code>;---------------------------------------------------------------------------------------------
; Сжатие базы данных Access с установкой нового пароля доступа с помощью транслятора
; Microsoft.Jet.OLEDB.4.0 и библиотеки Jet and Replication Objects(JRO).
;
; Использована база данных access.mdb из первого примера, расположите её рядом со скриптом.
; Language: AutoIt3
; ODBC 3.51 и выше
; Win 98/Me/XP
;---------------------------------------------------------------------------------------------
; Рекомендуется проверить соединение с этой базой на поставщике Microsoft.Jet.OLEDB.4.0 с помощью службы
; Microsoft Data Link(Откройте подменю [Создать] контекстного меню проводника и выберите Microsoft Data Link (*.udl)).
; Это позволит убедится в работоспособности транслятора.
;---------------------------------------------------------------------------------------------

Global $flag

;[Генерация строки инициализации JET]
;---------------------------------------------------------------------------------------------
Func ConnectionProperty($Pwd,$Dbq)

;Строка инициализации Microsoft.Jet.OLEDB:

$JetString = &quot;Provider=Microsoft.Jet.OLEDB.4.0;&quot;   &amp; _
    &quot;Password=;&quot; &amp; _
    &quot;User ID=;&quot; &amp; _
    &quot;Data Source=&quot; &amp; $Dbq &amp; &quot;;&quot; &amp; _
    &quot;Mode=Share Deny None;&quot; &amp; _
    &quot;Extended Properties=;&quot; &amp; _
    &quot;Locale Identifier=1033;&quot; &amp; _
    &quot;Jet OLEDB:System database=;&quot; &amp; _
    &quot;Jet OLEDB:Registry Path=;&quot; &amp; _
    &quot;Jet OLEDB:Database Password=&quot; &amp; $Pwd &amp; &quot;;&quot; &amp; _
    &quot;Jet OLEDB:Engine Type=5;&quot; &amp; _
    &quot;Jet OLEDB:Database Locking Mode=1;&quot; &amp; _
    &quot;Jet OLEDB:Global Partial Bulk Ops=2;&quot; &amp; _
    &quot;Jet OLEDB:Global Bulk Transactions=1;&quot; &amp; _
    &quot;Jet OLEDB:New Database Password=;&quot;  &amp; _
    &quot;Jet OLEDB:Create System Database=False;&quot; &amp; _
    &quot;Jet OLEDB:Encrypt Database=False;&quot; &amp; _
    &quot;Jet OLEDB:Don&#039;t Copy Locale on Compact=False;&quot; &amp; _
    &quot;Jet OLEDB:Compact Without Replica Repair=True;&quot; &amp; _
    &quot;Jet OLEDB:SFP=False&quot;

return $JetString
EndFunc

;[Сжатие базы и установка нового пароля]
;---------------------------------------------------------------------------------------------
Func CompactDataBase()

    $flag=0  ;Сигнализатор ошибки

    ;/Исходная база/
    $Dbq1=&quot;C:\TestAccess\access.mdb&quot;  

    ;/База назначения/
    $Dbq2=&quot;C:\TestAccess\proxy.jet&quot;    

    ;/***Укажите здесь старый пароль***/
    $OldPwd=&quot;&quot;    

    ;/***Укажите здесь новый пароль***/
    $NewPwd=&quot;123&quot;      

    ;/Сжатие и смена пароля/
    $Err=ObjEvent(&quot;AutoIt.Error&quot;,&quot;JET_ErroHandler&quot;)
    $JetEngine=ObjCreate(&quot;JRO.JetEngine&quot;)

    ;/Выход в случае ошибки/
    If $flag=1 then return -1

    $result=$JetEngine.CompactDatabase( ConnectionProperty($OldPwd,$Dbq1), ConnectionProperty($NewPwd,$Dbq2))

    ;/Выход в случае ошибки/
    If $flag=1 then return -1

    ;/Копирование файлов/

    ;/Удаляем исходную базу/
    FileDelete($Dbq1)  

    ;/Ставим результирующую базу на место исходной/
    FileMove($Dbq2,$Dbq1,1)

    MsgBox (262192,&quot;Изменение пароля&quot;, &quot;База данных сжата. Пароль изменен.&quot;)

EndFunc

;[Регистратор ошибки]
;---------------------------------------------------------------------------------------------
Func JET_ErroHandler()
    MsgBox (262192,    &quot;Произошла ошибка.&quot;, _
            &quot;Произошла ошибка:Возможно:&quot; &amp; @CR &amp; _
            &quot;1] Неработоспособен поставщик Microsoft.Jet.OLEDB&quot; &amp; @CR &amp; _
            &quot;2] Отсутствует база данных.&quot;   &amp; @CR &amp; _
            &quot;3] Неверно указан исходный пароль.&quot;)
    $flag=1
EndFunc
;---------------------------------------------------------------------------------------------
CompactDataBase()  ;Вызов примера</code></pre></div><p>Получение списка таблиц заданной базы данных Access.<br /></p><div class="codebox"><pre><code>;---------------------------------------------------------------------------------------------
;Получение списка таблиц заданной базы данных Access.
;
; Использована база данных access.mdb из первого примера, расположите её рядом со скриптом.
; Language: AutoIt3
; ODBC 3.51 и выше
; Win 98/Me/XP

;---------------------------------------------------------------------------------------------
Func ListTables()
$Err=ObjEvent(&quot;AutoIt.Error&quot;,&quot;nothing&quot;)

$conn = ObjCreate(&quot;ADODB.Connection&quot;)
$cat = ObjCreate(&quot;ADOX.Catalog&quot;)
$tbl = ObjCreate(&quot;ADOX.Table&quot;)
  
  
$result=$conn.Open(&quot;Driver={Microsoft Access Driver (*.mdb)};&quot; &amp; _  
      &quot;DBQ=&quot; &amp; @ScriptDir &amp; &quot;\access.mdb&quot; )

$cat.ActiveConnection = $conn
$TableName=&quot;&quot;
For $h=1 to $cat.Tables.Count-1
  $TableName=$TableName &amp; $cat.Tables.Item($h).Name &amp; @CR
Next

$conn.Close
$conn=0
$cat=0
$tbl=0
  MsgBox(64,&quot;Обнаруженные таблицы:&quot;,$TableName)
EndFunc
;---------------------------------------------------------------------------------------------
ListTables()  ;Вызов примера</code></pre></div><p>VBScript: Пример создания базы данных Access в текущем каталоге с помощью функции SQLConfigDataSource. Потребуется установленная библиотека <a href="http://www.script-coding.com/dynwrap.html">DynamicWrapper</a><br /></p><div class="codebox"><pre><code>&#039;---------------------------------------------------------------------------------------------
&#039; Пример создания базы данных Access в текущем каталоге с помощью функции SQLConfigDataSource.
&#039;
&#039; Потребуется установленная библиотека DynamicWrapper (http://www.script-coding.com/dynwrap.html)
&#039; Language: VBScript
&#039; ODBC 3.51 и выше
&#039; Win 98/Me/XP
&#039;---------------------------------------------------------------------------------------------

Dim intDoIt
  
intDoIt = MsgBox(&quot;Попробуем создать базу данных Access с помощью [DynamicWrapper] ?&quot;,  _  
vbOKCancel Or vbInformation,    _
&quot;Создание баз данных&quot;)

If intDoIt = vbCancel Then
    WScript.Quit
Else
    CreateDataSource()
End If

&#039;[Создание базы данных Access 4.0 в текущем каталоге]
&#039;---------------------------------------------------------------------------------------------
Function CreateDataSource()

 Path=&quot;.\access.mdb&quot;    &#039;//Укажите каталог в случае необходимости//
 Const ODBC_ADD_SYS_DSN   = 4

 Set DWrapper=CreateObject(&quot;DynamicWrapper&quot;)
 DWrapper.Register &quot;odbccp32.DLL&quot;, &quot;SQLConfigDataSource&quot;, &quot;i=hlss&quot;, &quot;f=s&quot;, &quot;r=l&quot;

 ResHandle = DWrapper.SQLConfigDataSource(0, _
            ODBC_ADD_SYS_DSN, _
            &quot;Microsoft Access Driver (*.mdb)&quot;, _
            &quot;CREATE_DB=&quot; &amp; Path)
 If ResHandle = 0 Then
    MsgBox &quot;Не удалось создать базу данных. Возможно она уже существует.&quot;,  _   
    vbExclamation, _
    &quot;Создание баз данных&quot;
    WScript.Quit
 Else
    MsgBox &quot;Создана база данных Access.&quot;,  _  
    vbInformation, _
    &quot;Создание баз данных&quot;
    WScript.Quit
 End If
End Function
&#039;---------------------------------------------------------------------------------------------</code></pre></div>]]></description>
			<author><![CDATA[null@example.com (Poltergeyst)]]></author>
			<pubDate>Sat, 02 Jan 2010 13:24:14 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=31970#p31970</guid>
		</item>
	</channel>
</rss>
