DataLink или Connection String ?

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

DataLink или Connection String ?

Сообщение Юстас » 29.01.2004 (Чт) 7:26

Есть ADODC, подключаемый с помощью Connection String. Но при этом базу всегда приходится ложить в жёстко оговоренную папку. Попытка изменить Connection String, например: frmMain.Adodc1.ConnectionString = Replace(frmMain.Adodc1.ConnectionString, "D:\CR", App.Path) неприводит к результату. ("D:\CR" - путь к папке, в которой писался проект.
ADODC по-прежнему ищет старый путь. Есть ли какие способы указать ADODC путь к текущей папке - App.Path? Чтобы не приходилось создавать отдельно для базы папку "D:\CR" на каждом компе, где стоит программа. Чтобы база лежала вместе с ехе.
Пробовал подключить с помощью DataLink файла - его имя тоже жестко зафиксировано в свойствах ADODC: ConnectionString=D:\CR\Datalink.udl и записать с App.Path не получается. Должен ведь быть способ гибкого подключения ADODC, к базе которая может лежать в любом месте. Подскажите пожалуйста, кто знает, как это сделать.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 29.01.2004 (Чт) 10:22

Если у тебя база всегда будет лежать рядом с проектом, то убери путь к ней вообще - оставь в ConnectionString только название. По умолчанию будет использоваться как раз App.Path.
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=mydb.mdb;Persist Security Info=False"

Еще вариант: не прописывай свойства на форме. Делай все в рантайме.

Код: Выделить всё
Private Sub Form_Load()
    Adodc1.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & app.path & "\mydb.mdb" & ";Persist Security Info=False"
    Adodc1.RecordSource = "Customers"
    Adodc1.Refresh
   
    Set DataGrid1.DataSource = Adodc1
End Sub


Еще вариант - использовать объекты Connection и Recordset из библиотеки ADO.
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 29.01.2004 (Чт) 13:41

Ну вот только не надо открывать соединение в Form_Load, если этого не нужно.
Принцип в том, чтобы открывать его лишь по меренеобходимости и закрывать так быстро, как это только возможно. (Не для Rainbow сказано :)).

Мой совет еще и в том, что лучше вынести такие вещи, как строки связи куда-нибудь в модуль как Public Const и т.п. Проще будет менять при написании новых версий. Да и проще связывать с путями во время выполнения.

Код: Выделить всё
Public Const Connection As String = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source="

...

adDB.ConnectionString = Connection & App.Path & "\" & dbName


Имя самой базы в программу лчше не зашивать,а хранить в конфигурационном файле (ini, либо, еще лучше, xml).
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 29.01.2004 (Чт) 13:53

Да все дело в том, что провайдер не Jet. Ole db. И не позволяет относительные пути. Пробовал с .udl - результат тот же. Хотя после запуска программы меняю в ConnectionString D:\CR на App.Path и вроде без ошибок проходит, и более того, вызываю в заголовок формы ConnectionString - пишет "C:\Program Files\ и т.д. но при этом на C:\ базы НЕТ !!!, она по прежнему на D:\, и отображается благополучно в гриде. И всё работает.
А по поводу Dim rs as ADODB - не хотелось, программа работает на нескольких машинах, и переделывать всё не очень приятно, думал, просто изменить как-нибудь ConnStr и сделать гибкую локализацию приложения. Ну видно это c ADODC и OLE DB невозможно.

Rainbow
Человек-радуга
Человек-радуга
 
Сообщения: 543
Зарегистрирован: 13.05.2003 (Вт) 14:16

Сообщение Rainbow » 29.01.2004 (Чт) 14:29

Юстас писал(а):Хотя после запуска программы меняю в ConnectionString D:\CR на App.Path и вроде без ошибок проходит, и более того, вызываю в заголовок формы ConnectionString - пишет "C:\Program Files\ и т.д. но при этом на C:\ базы НЕТ !!!, она по прежнему на D:\, и отображается благополучно в гриде. И всё работает.

Не понятно, почему база должна переехать с D:\ на С:\ при изменении ConnectionString? И почему не подходит вариант с инициализацией в рантайме? Много таких форм, на которых adodc лежит? Можно ведь где-то всторонке создать рекордсет и подсунуть его adodc...
Учиться - значит открывать для себя то, что уже знаешь. <...> Учить - значит напоминать другим о том, что они знают это также хорошо, как и ты. <...> Лучше всего ты учишь тому, чему тебе самому больше всего надо научиться. (Р. Бах)

Юстас
Бывалый
Бывалый
 
Сообщения: 200
Зарегистрирован: 24.10.2003 (Пт) 5:05

Сообщение Юстас » 30.01.2004 (Пт) 0:15

База никуда не переедет, я хотел, чтобы программа хотя бы ругнулась, что не могу найти базу или ошибка драйвера ли ещё чего, это было бы показателем, что строка связи сменилась. но ошибки не происходит, строка связи указывает на С, если перенести на С базу, а на D её затереть, вот тогда будет ошибка. А ADODC - три штуки, на разных формах, и работают с разными базами, так что, возможность их влияния друг на друга исключена.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот и гости: 3

    TopList