C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
ADO — чьи глюки: ее или мои?
Deem
Отправлено: 10.06.2004, 17:02


Мастер участка

Группа: Участник
Сообщений: 327



Появилась надобность написать маленькую программульку на пару таблиц, однопользовательскую, на вывоз. Т.е. я не знаю, стоит ли на компе BDE,какой версии и может станет когданибудь. Не хочется несостыковок различных, тем более, что изера там не очень (корабельный комп).
Как-то не хочется в инсталляху BDE совать. Или может ничего? Может в последних версиях все Ок?

Ну я попробовал DBExpress и ADO.
DBExpress работать вобще не захотел: потребовал DLL, которой я не нашел. ADO настроил в XP. Попер в 98, прога не пошла: не указан источник данных...
Меня интересует, можно ли настроить эту хрень программно без
участия юзера? Типа, как можно создать алиас в BDE со всеми делами и не лохматить бабушку. smile.gif


AVC
Отправлено: 10.06.2004, 17:11


Ветеран

Группа: Модератор
Сообщений: 1583



Если нет проблем с местом создавйте install и не ломайте голову. Borland'овский заточен под BDE а в InnoSetup придется ручками.
_vadim_
Отправлено: 10.06.2004, 21:01


Ученик-кочегар

Группа: Участник
Сообщений: 18



Мда, злободневная оказываетя тема.
У меня та же самая проблема, не хочет запускаться на другой машине.
Причем если на той машине не установлен офис, то выдает ошибку такую как вы описали.
Судя по ошибке предполагаю что БД Access.
Если так, и при этом не нужен пароль на БД. То могу посоветовать
провайдер Microsoft Jet 4.0 OLE DB Provider, без пароля у меня работает
независимо от системы.
olegenty
Отправлено: 11.06.2004, 06:37


Ветеран

Группа: Модератор
Сообщений: 2412



а настроить можно, главное изучить ADOConnection->Parameters (я пока даже доступиться к ним не смог нормально), либо изучить сам перечень необходимых и достаточных для коннекта параметров. ("Data Source" и др...)
Valdemar
Отправлено: 11.06.2004, 08:13


Мастер участка

Группа: Участник
Сообщений: 433



Если база Access, то лучше использовать ADO. Но для этого на компьютере должен быть установлен Microsoft Data Access Components, который в WinMe/Win2000/WinXP уже есть. Так же он устанавливается вместе с Office2000/XP. Скачайте дистрибутив с сайта Microsoft (файл mdac_typ.exe) и распространяйте со своей программой, а пользователи при необходимости пусть его установят на свой компьютер.
2_vadim_
QUOTE
Если так, и при этом не нужен пароль на БД. То могу посоветовать провайдер Microsoft Jet 4.0 OLE DB Provider, без пароля у меня работает независимо от системы.

Чтобы работало с паролем, надо строку соединения немного поправить. Вот так у меня прекрасно работает:
CODE
ADOConnection1->Connected=false;
AnsiString base_link;
base_link="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
base_link+="base.mdb;Persist Security Info=False;";
base_link+="Jet OLEDB:Database Password=12345";
ADOConnection1->ConnectionString=base_link;
ADOConnection1->Connected=true;
Deem
Отправлено: 11.06.2004, 09:49


Мастер участка

Группа: Участник
Сообщений: 327



Да, все правильно. Я уже решил проблему для себя.

Если играться с таблами DBF или Paradox, тогда на целевой машине (говорю о 98) надо запустить "Источники данных ODBC" и выбрать (если уже есть) или создать источник данных, обрабатывающий формат ваших таблиц. Имя ему даете сами (если новый), а потом в ConnectionString в секции DataSource указываете именно это имя.

В XP в ..\System32\ODBC.INI, в 98 — ..\System\ODBC.INI — там храняться записи об этих самых источниках данных. Меня интересовала возможность модификации их программно без вызова стандартного диалога настройки. Запись, полученную на XP я скопировал в ODBC.ini для 98. Они у меня на разных разделах. Поэтому я изменил пути к DLL (есть там в ODBC.ini). 98 — недавно переставленный, чистый.
После перезагрузки запускаю свою прогу. В ней сделал возможеность изменения ConnectionStrong в мемо. Вписываю туда имя источника данных и ....опа! законектился и прочитал таблу.
Но это еще не все! Когда хотел ее редактировать и переместиться на другую строку получил "Мало данных из внешней таблицы для сохранения". Короче, не дали изменить. Хотя под XP все нормально редактировалось. Эту проблему я не решил. И это касается таблицы DBF.
Для таблицы Paradox и это не получилось, хотя в 98 в списке есть драйвер для Paradox. Я не смог даже законектиться под 98.

Далее, еще одна штучка: Я меняю содержимое файла ODBC.ini, переименвываю источник данных, который сам создал, и перегружаюсь.
Однако, в диалоге настройки сточников висит старое имя. Перерыл все файлы винды и не нашел, откуда она это взяла!

Тогда я решил использовать базу Access. В XP ее создал и заполнил ConnectionString, как советует Voldemar. Выбрал провайдер не тот, что там стоит по-умолчанию, а Provider=Microsoft.Jet.OLEDB.4.0. и
DataSource = Моя база.
И в XP все заработало.
Самое главное, что при переходе под 98 не пришлось нигде лазить, ничего менять! Все заработало и заредактировалось сразу. При перемещении базы в другой каталог я меняю только DataSource = Моя база в другом месте.
Надо еще потестить под другими 98 и 2000. Если работает, то AOD + база Access — нормальный безпроблемный настольный СУБД под винду.
Кстати, и для такой базы редактор есть (ACCESS smile.gif) и многопользование работает. Ругается только тогда, когда редактируется одна строка.

BDE в инсталляху вставить мона. Но я помню, как когда-то летело все к чертям, когда на машину с моей прогой ставили нечто поновее с новой версией BDE!

Нужен вариант без изменений в винде? Совместимость, короче, со старым и новым. BDE не подходит. Может новые драйвера и получше старых, однако нет гарантии, что кто-то не припрет прогу на дельфе парулетней давности.
biggrin.gif
_vadim_
Отправлено: 11.06.2004, 11:24


Ученик-кочегар

Группа: Участник
Сообщений: 18



QUOTE

Чтобы работало с паролем, надо строку соединения немного поправить. Вот так у меня прекрасно работает:
CODE  
ADOConnection1->Connected=false;
AnsiString base_link;
base_link="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=";
base_link+="base.mdb;Persist Security Info=False;";
base_link+="Jet OLEDB:Database Password=12345";
ADOConnection1->ConnectionString=base_link;
ADOConnection1->Connected=true;

Нет, ну надо же! smile.gif Я использовал стандартный построитель строки и у меня получалось вот что:
CODE

CS = "Provider=Microsoft.Jet.OLEDB.4.0;Password="
        +edPasswordDb->Text+";Data Source="
        +DirectoryEdit1->Text+"\\db1.mdb;Persist Security Info=True";


И вот эта строка выдавала ошибку на пароль. :\
Спасибо большое за науку, теперь буду знать. smile.gif
Deem
Отправлено: 16.06.2004, 11:39


Мастер участка

Группа: Участник
Сообщений: 327



Всем спасибо: и у меня работает шикарно.
Однако, может подскажете, как при помощи ADO поменять пароль к базе Access? Чтоб клиент мог далее изменять свой пароль.
olegenty
Отправлено: 17.06.2004, 07:38


Ветеран

Группа: Модератор
Сообщений: 2412



если ты как-то через ADO выйдешь на DAO Engine интерфейс — то будет тебе счастье. в противном случае, по-моему никак.
olegenty
Отправлено: 17.06.2004, 07:45


Ветеран

Группа: Модератор
Сообщений: 2412



я когда с Access работал, работал посредством бесплатного набора компонентов KaDAO. плюсы — инкапсуляция всех методов DAO Engine и отсутствие необходимости в MDAC_TYP, достаточно наличие на компьютере даже не самого Access, а лишь DLL-ок DAO.
Deem
Отправлено: 17.06.2004, 09:22


Мастер участка

Группа: Участник
Сообщений: 327



Ааааа, знаю : ДАО — это китайская философия? smile.gif
Deem
Отправлено: 17.06.2004, 10:18


Мастер участка

Группа: Участник
Сообщений: 327



Вот содрал с форума "Королевство DELPHI"


------------------------------------------------------------------------------------------------
02-07-2002 20:00

Это ж надо, совсем плохой стал...
Правильный способ смены пароля лежит под самым носом:
С помощью ADOQuery нужно выполнить команду
'ALTER DATABASE PASSWORD новыйпароль старыйпароль'.
Или тем же ADOConnection:
ADOConnection1.Execute('ALTER DATABASE PASSWORD новыйпароль старыйпароль');
в любом случае Connection должно быть открыто с монопольным доступом (в ConnectionString указать Mode=12;)


Александр

------------------------------------------------------------------------------------------------
02-07-2002 20:33

И еще.
Jet database engine поддерживает два уровня безопасности share-level (зашита паролем при открытии файла БД) и user-level (а также workgroup-based security, ограничение полномочий пользователей [USER]
и групп [GROUP] пользователей).
В предыдущем сообщении изменялся share-level пароль,
для USER команда такая:
'ALTER USER username PASSWORD NewPassword OldPassword'
Читайте:
http://msdn.microsoft.com/library (Advanced Microsoft Jet SQL for Access 2000)


Александр
------------------------------------------------------------------------------------------------
olegenty
Отправлено: 17.06.2004, 10:23


Ветеран

Группа: Модератор
Сообщений: 2412



а вот об этой SQL инструкции Access'a то я никогда и не знал...

Вернуться в Работа с базами данных в C++Builder