1 (изменено: Poltergeyst, 2019-04-08 15:47:28)

Тема: AutoIt v3: работа с базой данных Access с помощью ODBC API

Без гарантий. Используете на свой страх и риск.

Подборка темы Работа с базами данных с помощью скриптовых интерфейсов.

Пример работы с базой Access 4.0 через функции ODBC API в среде AutoIt3. Ведется прямая работа с базой, в обход источника данных.

;---------------------------------------------------------------------------------------------
; Пример работы с базой 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("odbccp32.dll")    ;Открываем библиотеку установщика ODBC
$MANAGER = DllOpen("odbc32.dll")    ;Открываем библиотеку менеджера драйверов ODBC

Dim $InitData[2]
$dir=@ScriptDir

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

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

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

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

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

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

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

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

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

$SQL_COMMAND="CREATE TABLE TESTTABLE(col1 varchar,col2 varchar)"
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="INSERT INTO TESTTABLE VALUES('This Is Access 4.0',' database')"
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="SELECT * FROM TESTTABLE"
StaticSQLStatement($SQL_COMMAND,$HANDLE_STMT)
$ColumnsCount=ColCount($HANDLE_STMT)
$DATA=QuerySQLStatement($ColumnsCount,$HANDLE_STMT)
$DATA=StringReplace($DATA,"^",";" & @CR)
MsgBox (262192,"[Выборка массива данных]","[Возвращенные данные]" & @CR & $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,"short","SQLDisconnect", _
             "long",$HANDLE_CONN)
;------------------------------------------------------------------------
;/Освобождение дескриптора соединения/

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

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

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

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

;Дескриптор требуется обновлять после каждого запроса
;---------------------------------------------------------------------------------------------
If $Free=True then
;Освобождение операторного дескриптора
$result=DllCall($MANAGER, _
    "short","SQLFreeStmt", _
    "long",$StmtHnd, _        
    "long",$SQL_DROP)  
EndIf
;---------------------------------------------------------------------------------------------
If $Generate=True then
;Генерация операторного дескриптора
$HANDLE_BUFFER  = DllStructCreate("udword")
$result=DllCall($MANAGER, _
      "short","SQLAllocStmt", _
      "long",$ConnHnd, _
      "long",DllStructGetPtr($HANDLE_BUFFER))
      ;-----------------------------------------
      If $result[0]<>$SQL_SUCCESS then
      MsgBox (16,"Произошла ошибка", "Произошла ошибка: генерация операторного дескриптора.")
        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,"short","SQLExecDirectW", _
    "long"  ,$StmtHnd, _      
    "wstr"  ,$SQL_COMMAND, _      
    "long"  ,$SQL_COMMAND_LEN)
    
    ;-----------------------------------------------------------------------------------------
    Select
    Case $result[0]<>$SQL_SUCCESS
      MsgBox (262192,"Произошла ошибка", "Произошла ошибка: Выполнение статического запроса.")
    Case $result[0]=$SQL_SUCCESS
      MsgBox (262192,"[Работала API SQLExecDirectW]", _
            "[Выполнение статического запроса]" & @CR & _
            "[Результат]"  & @CR & $result[0] & @CR & _
            "[Запрос SQL]"  & @CR & $result[2])
    EndSelect
EndFunc


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

$SZ_BUFFER_SIZE  = 255
$SZ_BUFFER = DllStructCreate("char[" & $SZ_BUFFER_SIZE & "]")
$LENGHT = DllStructCreate("long")
$D = ""

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

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

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

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

AccessSample()  ;Вызов примера
;poltergeyst 2006

Простейший случай обработки ошибки ODBC.

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

    If $odbcRes<>0 then
        ODBCError()
        $odbcRes=0
    EndIf  
    
    If $msg = $GUI_EVENT_CLOSE then ExitLoop
    If $msg = $B1 then BadlyFunction()  
Wend

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

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

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

$result=DllCall($MANAGER, _
    "short","SQLAllocEnv", _
    "long",DllStructGetPtr($HANDLE_BUFFER))

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

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

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

$result=DllCall($MANAGER, _
    "short","SQLAllocConnect", _
    "long",$HANDLE_ENV, _
    "long",DllStructGetPtr($HANDLE_BUFFER))

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

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

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

$odbcRes=$result[0]
If $odbcRes<>0 Then return -1
EndFunc

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

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

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

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

MsgBox (262192,"Произошла ошибка ODBC", _
    "[SQL STATE]"  & @CR & $result[4] & @CR & _
    "[Описание]"  & @CR & $result[6])
EndFunc

Сжатие базы данных Access с установкой нового пароля доступа с помощью транслятора Microsoft.Jet.OLEDB.4.0 и библиотеки Jet and Replication Objects(JRO).

;---------------------------------------------------------------------------------------------
; Сжатие базы данных 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 = "Provider=Microsoft.Jet.OLEDB.4.0;"   & _
    "Password=;" & _
    "User ID=;" & _
    "Data Source=" & $Dbq & ";" & _
    "Mode=Share Deny None;" & _
    "Extended Properties=;" & _
    "Locale Identifier=1033;" & _
    "Jet OLEDB:System database=;" & _
    "Jet OLEDB:Registry Path=;" & _
    "Jet OLEDB:Database Password=" & $Pwd & ";" & _
    "Jet OLEDB:Engine Type=5;" & _
    "Jet OLEDB:Database Locking Mode=1;" & _
    "Jet OLEDB:Global Partial Bulk Ops=2;" & _
    "Jet OLEDB:Global Bulk Transactions=1;" & _
    "Jet OLEDB:New Database Password=;"  & _
    "Jet OLEDB:Create System Database=False;" & _
    "Jet OLEDB:Encrypt Database=False;" & _
    "Jet OLEDB:Don't Copy Locale on Compact=False;" & _
    "Jet OLEDB:Compact Without Replica Repair=True;" & _
    "Jet OLEDB:SFP=False"

return $JetString
EndFunc

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

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

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

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

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

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

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

    ;/Выход в случае ошибки/
    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,"Изменение пароля", "База данных сжата. Пароль изменен.")

EndFunc

;[Регистратор ошибки]
;---------------------------------------------------------------------------------------------
Func JET_ErroHandler()
    MsgBox (262192,    "Произошла ошибка.", _
            "Произошла ошибка:Возможно:" & @CR & _
            "1] Неработоспособен поставщик Microsoft.Jet.OLEDB" & @CR & _
            "2] Отсутствует база данных."   & @CR & _
            "3] Неверно указан исходный пароль.")
    $flag=1
EndFunc
;---------------------------------------------------------------------------------------------
CompactDataBase()  ;Вызов примера

Получение списка таблиц заданной базы данных Access.

;---------------------------------------------------------------------------------------------
;Получение списка таблиц заданной базы данных Access.
;
; Использована база данных access.mdb из первого примера, расположите её рядом со скриптом.
; Language: AutoIt3
; ODBC 3.51 и выше
; Win 98/Me/XP

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

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

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

$conn.Close
$conn=0
$cat=0
$tbl=0
  MsgBox(64,"Обнаруженные таблицы:",$TableName)
EndFunc
;---------------------------------------------------------------------------------------------
ListTables()  ;Вызов примера

VBScript: Пример создания базы данных Access в текущем каталоге с помощью функции SQLConfigDataSource. Потребуется установленная библиотека DynamicWrapper

'---------------------------------------------------------------------------------------------
' Пример создания базы данных Access в текущем каталоге с помощью функции SQLConfigDataSource.
'
' Потребуется установленная библиотека DynamicWrapper (http://www.script-coding.com/dynwrap.html)
' Language: VBScript
' ODBC 3.51 и выше
' Win 98/Me/XP
'---------------------------------------------------------------------------------------------

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

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

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

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

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

 ResHandle = DWrapper.SQLConfigDataSource(0, _
            ODBC_ADD_SYS_DSN, _
            "Microsoft Access Driver (*.mdb)", _
            "CREATE_DB=" & Path)
 If ResHandle = 0 Then
    MsgBox "Не удалось создать базу данных. Возможно она уже существует.",  _   
    vbExclamation, _
    "Создание баз данных"
    WScript.Quit
 Else
    MsgBox "Создана база данных Access.",  _  
    vbInformation, _
    "Создание баз данных"
    WScript.Quit
 End If
End Function
'---------------------------------------------------------------------------------------------