1. Работа с базой данных доступа в DELPHI (создание файла .mdb, сжатие базы данных).
Следующий код прошел проверку под WIN2K, D6, MDAC2.6,
Скомпилированная программа успешно работает во второй версии WIN98 без среды ACCESS.
//Перед использованием ComObj,ActiveX
//Объявляем строку подключения
Конст
SConnectionString = 'PRovider=Microsoft.Jet.OLEDB.4.0;Источник данных=%s;'
+'Jet OLEDB:Пароль к базе данных=%s;';
//============================================== ============================
// Процедура: GetTempPathFileName
// Автор: ysai
// Дата: 27 января 2003 г.
// Аргументы: (Нет)
// Результат: строка
//============================================== ============================
функция GetTempPathFileName():строка;
//Получаем имя временного файла
вар
SPath,SFile: массив [0..254] символов;
начинать
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
результат:=SFile;
УдалитьФайл(PChar(результат));
конец;
//============================================== ============================
// Процедура: CreateAccessFile
// Автор: ysai
// Дата: 27 января 2003 г.
// Аргументы: ИмяФайла:Строка;Пароль:строка=''
// Результат: логическое значение
//============================================== ============================
функция CreateAccessFile(FileName:String;PassWord:string=''):boolean;
//Создаем файл доступа, ошибка, если файл существует
вар
STempFileName: строка;
vCatalog: Олевариант;
начинать
STempFileName:=GetTempPathFileName;
пытаться
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
результат:=CopyFile(PChar(STempFileName),PChar(FileName),True);
УдалитьФайл(STempFileName);
кроме
результат: = ложь;
конец;
конец;
//============================================== ============================
// Процедура: Компактная база данных
// Автор: ysai
// Дата: 27 января 2003 г.
// Аргументы: AFileName,APassWord:строка
// Результат: логическое значение
//============================================== ============================
функция CompactDatabase(AFileName,APassWord:string):boolean;
//Сжимаем и восстанавливаем базу данных, перезаписываем исходные файлы
вар
STempFileName: строка;
vJE:ОлеВариант;
начинать
STempFileName:=GetTempPathFileName;
пытаться
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(формат(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
результат:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
УдалитьФайл(STempFileName);
кроме
результат: = ложь;
конец;
конец;
//============================================== ============================
// Процедура: Изменить пароль базы данных
// Автор: ysai
// Дата: 27 января 2003 г.
// Аргументы: AFileName,AOldPassWord, ANewPassWord:строка
// Результат: логическое значение
//============================================== ============================
функция ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//Изменить пароль базы данных ACCESS
вар
STempFileName: строка;
vJE:ОлеВариант;
начинать
STempFileName:=GetTempPathFileName;
пытаться
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(формат(SConnectionString,[AFileName,AOldPassWord]),
format(SConnectionString,[STempFileName,ANewPassWord]));
результат:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
УдалитьФайл(STempFileName);
кроме
результат: = ложь;
конец;
конец;
2. На что следует обратить внимание и несколько советов при использовании операторов SQL в ACCESS
Следующий оператор SQL передал запрос в ACCESS XP
Создать таблицу:
Создать таблицу Tab1 (
ID-счетчик,
Строка имени,
Целое число возраста,
[Дата]ДатаВремя);
Навык:
Поля автоинкремента объявляются с помощью Counter.
Поля, имена которых являются ключевыми словами, заключаются в квадратные скобки [], в качестве имен полей также допустимы числа.
Создать индекс:
Следующий оператор создает повторяемый индекс в столбце «Дата» на вкладке Tab1.
Создать индекс iDate ON Tab1 ([Дата]);
После завершения атрибут индекса даты поля в ACCESS отображается как - Да (есть дубликаты).
Следующий оператор создает неповторяющийся индекс в столбце «Имя» Tab1.
Создать уникальный индекс iName ON Tab1 (Name);
После завершения атрибут индекса поля Имя в ACCESS отображается как - Да (без дублирования).
Следующий оператор удаляет два только что созданных индекса.
Удалить индекс iDate ON Tab1;
Удалить индекс iName ON Tab1;
Сравнение операторов ACCESS и UPDATE в SQLSERVER:
Инструкция UPDATE для обновления нескольких таблиц в SQLSERVER:
ОБНОВЛЕНИЕ Tab1
SET a.Name = b.Name
ИЗ Tab1 a, Tab2 b
ГДЕ a.ID = b.ID;
Оператор SQL с той же функцией в ACCESS должен быть
ОБНОВЛЕНИЕ Tab1 a, Tab2 b
SET a.Name = b.Name
ГДЕ a.ID = b.ID;
То есть: инструкция UPDATE в ACCESS не имеет предложения FROM, и все таблицы, на которые имеются ссылки, перечислены после ключевого слова UPDATE.
В приведенном выше примере, если Tab2 — это не таблица, а запрос, например:
ОБНОВЛЕНИЕ Tab1 a, (выберите идентификатор, имя из Tab2) b
SET a.Name = b.Name
ГДЕ a.ID = b.ID;
Доступ к нескольким различным базам данных ACCESS — используйте предложение In в SQL:
Выберите a.*,b.* из Tab1 a,Tab2 b в 'db2.mdb', где a.ID=b.ID;
Приведенный выше оператор SQL запрашивает все записи, связанные с Tab2 в Tab1 и db2.mdb (в текущей папке) в текущей базе данных.
Недостатки. Внешние базы данных не могут иметь паролей.
Дополнение: увидел ответ ugvanxk в посте и могу им воспользоваться
Выберите * из [c:/aa/a.mdb;pwd=1111].table1;
Тест ACCESS XP пройден
Доступ к другим источникам данных ODBC в ACCESS
В следующем примере запрашиваются данные в SQLSERVER в ACCESS.
ВЫБРАТЬ * ИЗ Tab1 В [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Server=127.0.0.1;DataBase=Demo;]
Полные параметры свойства подключения к внешнему источнику данных:
[ODBC;DRIVER=драйвер;SERVER=сервер;DATABASE=база данных;UID=пользователь;PWD=пароль;]
DRIVER=драйвер можно найти в реестре
HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI/
найден в
Для импорта данных между гетерогенными базами данных см. Blue Blood Sword.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
ACCESS поддерживает подзапросы
ACCESS поддерживает внешние соединения, но не включает полные внешние соединения. Если поддерживается,
ЛЕВОЕ СОЕДИНЕНИЕ или ПРАВОЕ СОЕДИНЕНИЕ
но не поддерживается
ПОЛНОЕ ВНЕШНЕЕ СОЕДИНЕНИЕ или ПОЛНОЕ СОЕДИНЕНИЕ
Запрос даты в ACCESS
Примечание. Разделителем даты и времени в ACCESS является # вместо кавычек.
Выберите * Из Tab1 Где [Дата]>#2002-1-1#;
В DELPHI я использую это
SQL.Добавить(Формат(
'Выберите * из Tab1, где [Дата]>#%s#;',
[DateToStr(Дата)]));
Строки в ACCESS можно разделять двойными кавычками, но SQLSERVER их не распознает, поэтому для удобства миграции и совместимости
В качестве разделителей строк рекомендуется использовать одинарные кавычки.