Тема: 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
'---------------------------------------------------------------------------------------------