1. Работа с базой данных доступа в Delphi (создание файла .mdb, сжатие базы данных)
Следующий код был протестирован под Win2k, d6 и mdac2.6.
Скомпилированная программа успешно работает во второй версии Win98 без доступа к среде.
//перед использованием comobj,activex
//Объявляем строку подключения
константа
Connectionstring = 'provider=microsoft.jet.oledb.4.0;источник данных=%s;'
+'jet oledb:пароль базы данных=%s;';
//============================================== ============================
// процедура: gettemppathfilename
// автор: ysai
// дата: 27.01.2003
// аргументы: (нет)
// результат: строка
//============================================== ============================
функция gettemppathfilename():строка;
//Получаем имя временного файла
вар
spath,sfile&:array [0..254] символов;
начинать
gettemppath(254,пространство);
gettempfilename(spath,'~sm',0,sfile);
результат: = файл;
удалить файл (pchar (результат));
конец;
//============================================== ============================
// процедура: создать файл доступа
// автор: ysai
// дата: 27.01.2003
// аргументы: имя файла:строка;пароль:строка=''
// результат: логическое значение
//============================================== ============================
функция createaccessfile(имя файла:строка;пароль:строка=''):логическое;
//Создаем файл доступа, ошибка, если файл существует
вар
имя_стемпового_файла:строка;
вкаталог: олевариант;
начинать
Stempfilename:=gettemppathfilename;
пытаться
vcatalog:=createoleobject('adox.catalog');
vcatalog.create(format(connectionstring,[stempfilename,password]));
результат: = copyfile(pchar(stempfilename),pchar(имя файла),true);
удалить файл (имя шаблонного файла);
кроме
результат: = ложь;
конец;
конец;
//============================================== ============================
// процедура: компактная база данных
// автор: ysai
// дата: 27.01.2003
// аргументы: имя файла, пароль: строка
// результат: логическое значение
//============================================== ============================
функция Compactdatabase (имя файла, пароль: строка): логическое значение;
//Сжимаем и восстанавливаем базу данных, перезаписываем исходные файлы
вар
имя_стемпового_файла:строка;
vje: олевариант;
начинать
Stempfilename:=gettemppathfilename;
пытаться
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(format(строка подключения,[имя файла,пароль]),
format(sconnectionstring,[stempfilename,apassword]));
результат: = copyfile(pchar(stempfilename),pchar(afilename),false);
удалить файл (имя шаблонного файла);
кроме
результат: = ложь;
конец;
конец;
//============================================== ============================
// процедура: изменить пароль базы данных
// автор: ysai
// дата: 27.01.2003
// аргументы: имя файла, старый пароль, новый пароль: строка
// результат: логическое значение
//============================================== ============================
функция изменения пароля базы данных (имя файла, старый пароль, новый пароль: строка): логическое значение;
//Изменяем пароль доступа к базе данных
вар
имя_стемпового_файла:строка;
vje: олевариант;
начинать
Stempfilename:=gettemppathfilename;
пытаться
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(format(строка подключения, [имя файла, старый пароль]),
format(sconnectionstring,[stempfilename,anewpassword]));
результат: = copyfile(pchar(stempfilename),pchar(afilename),false);
удалить файл (имя шаблонного файла);
кроме
результат: = ложь;
конец;
конец;
2. На что следует обратить внимание и несколько советов при использовании операторов sql в доступе
Следующий оператор sql прошел проверку в запросе Access XP.
Создать таблицу:
создать таблицу tab1 (
счетчик идентификаторов,
строка имени,
целое число возраста,
[дата] дата-время);
Навык:
Поля автоинкремента объявляются со счетчиком.
Поля, имена которых являются ключевыми словами, заключаются в квадратные скобки [], в качестве имен полей также допустимы числа.
Создать индекс:
Следующий оператор создает повторяемый индекс в столбце даты на вкладке tab1.
создать идентификатор индекса на вкладке tab1 ([дата]);
После завершения атрибут индекса даты поля в доступе отображается как — Да (есть дубликаты).
Следующий оператор создает неповторяющийся индекс для столбца имени вкладки tab1.
создать уникальное имя индекса на вкладке tab1 (имя);
После завершения атрибут индекса имени поля в доступе отображается как — Да (без дублирования).
Следующий оператор удаляет два только что созданных индекса.
удалить идентификатор индекса на вкладке Tab1;
удалить имя индекса на вкладке Tab1;
Сравнение операторов обновления в Access и sqlserver:
Оператор обновления для обновления нескольких таблиц в sqlserver:
обновить вкладку 1
установите a.name = b.name
из tab1 a, tab2 b
где a.id = bi.id;
Оператор sql с той же функцией в доступе должен быть
обновить tab1 a, tab2 b
установите a.name = b.name
где a.id = bi.id;
То есть: оператор обновления в доступе не имеет предложения from, и все ссылочные таблицы перечислены после ключевого слова обновления.
В приведенном выше примере, если tab2 — это не таблица, а запрос, например:
обновить tab1 a, (выбрать идентификатор, имя из tab2) b
установите a.name = b.name
где a.id = bi.id;
Доступ к нескольким базам данных с различным доступом - используйте предложение 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;
тест доступа XP пройден
Доступ к другим источникам данных odbc в доступе
В следующем примере запрашиваются данные в sqlserver при доступе.
выберите * на вкладке tab1 в [odbc]
[odbc;driver=sql server;uid=sa;pwd=;server=127.0.0.1;database=demo;]
Полные параметры свойства подключения к внешнему источнику данных:
[odbc;драйвер=драйвер;сервер=сервер;база данных=база данных;uid=пользователь;пароль=пароль;]
Driver=драйвер можно найти в реестре
hkey_local_machine/software/odbc/odbcinst.ini/
найден в
Для импорта данных между гетерогенными базами данных см. Blue Blood Sword.
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
доступ поддерживает подзапросы
доступ поддерживает внешние соединения, но не включает полные внешние соединения, если они поддерживаются.
левое соединение или правое соединение
но не поддерживается
полное внешнее соединение или полное соединение
Запрос даты в доступе
Примечание. Разделителем даты и времени в Access является # вместо кавычек.
выберите * на вкладке 1, где [дата]>#2002-1-1#;
В делфи я использую это
sql.add(формат(
'выберите * из вкладки1, где [дата]>#%s#;',
[datetostr(дата)]));
Строки в доступе могут быть разделены двойными кавычками, но sqlserver их не распознает, поэтому для удобства миграции и совместимости
В качестве разделителей строк рекомендуется использовать одинарные кавычки.