Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Базы данных под .NET > Почему connection string это Application setting?


Автор: Dims 7.4.2009, 18:16
Не пойму, почему Connection string -- это application setting?

Я использую для работы с базой данных элемент проекта DataSet. Этот элемент позволяет визуально представить объекты базы данных и автоматически создаёт объекты и классы для доступа к ним. Информация хранится в файл XSD.

После добавления любого объекта в дизайнер (например, хранимой процедуры), в его свойствах прописывается ссылка на определённый Connection string, который автоматически создаётся в настройках программы. 

То есть, DataSet вынуждает меня пользоваться именно таким типом для хранения строки соединения с базой.

Далее, уже внутри Settings я вижу, что тип Connection string может быть только Application setting, то есть, его должно быть нельзя менять во время выполнения.

Я, конечно, нашёл обходной путь и всё-таки меняю эту настройку, но мне непонятна логика. Разве логично, когда в программу жёстко зашито имя сервера, имя базы данных и другие параметры строки доступа? Ведь база данных не распространяется вместе с программой. Или распространяется?

Ну даже если распространяется, то имя сервера всё равно не может быть таким же на всех компьютерах, где должна работать программа.

Так почему же они сделали, чтобы было так?

Автор: Экскалупатор 7.4.2009, 20:45
на сколько я знаю Connection string можно прописать жестко в код, а можно хранить в файле app.config и из него читать, ну по крайней мере так рекомендуют в книжках по ADO.NET и студия так делает.

Автор: PashaPash 7.4.2009, 20:49
Цитата(Dims @  7.4.2009,  18:16 Найти цитируемый пост)

Я, конечно, нашёл обходной путь и всё-таки меняю эту настройку, но мне непонятна логика. Разве логично, когда в программу жёстко зашито имя сервера, имя базы данных и другие параметры строки доступа? Ведь база данных не распространяется вместе с программой. Или распространяется?

Кроме обходного пути - в папке проекта лежит app.config, в котором этот connection string задается. Application setting - это просто оберка для чтения этого config-а со значениями по умолчанию.

Добавлено через 37 секунд
Экскалупатор, обогнал...

Автор: Idsa 7.4.2009, 20:58
Dims, может, я субъективен... но использование ORM мне видится лучшим (по сравнению с типизированным DataSet) во всех отношениях средством реализации DAL.

Автор: Экскалупатор 7.4.2009, 21:11
вообще я на данный момент пишу приложение для роботы с БД Access и мне кажется в моем случае нету особой необходимости писать строку подключения в файл(что соответственно будет вызывать задержки на чтение) да и нерадивый "умный пользователь" может подумать что это какой то "ненужный файл" и сломается вообще все, так что я решил прописать все в код. и еще, перетаскивание на форму и доверяние студии создавать датасеты и все остальное это как то жестко. я когда первый раз с этим столкнулся чуть  в обморок не упал, залез в листинг датасета(который студия создала), а там почти 6000(!) строк, потом переписал сам, только то что мне нужно, получилось строк ~200 и работать стало все намного быстрее. хотя, конечно, кому что ближе... нужно исходить из ситуации


PashaPash, ну, я не хотел...

Автор: thomas 7.4.2009, 21:17
Dims, 
Привет.
Я не знаю почему они так делают.
Когда создаешь типизированный DataSet, то можно в мастере не указывать сохранение connectionString в aap.config.
Вместо этого пойти в свойства проекта и на вкладке Settings создать свойство типа String не для аппликации, а для пользователя. Вот это свойство уже можно редактировать в runTime.

Или писать отдельный partial class с методом переопределения connectionString, который прописан в app.config.

ЗЫ Код добавлю чуть позже с другого компа. (тут есть русский, а там студия и проекты  smile )

Добавлено через 1 минуту и 59 секунд
Кстати если создавать настройки для пользователя, а не для аппликации, то они прописываются в файл user.config для каждого пользователя отдельно.

Автор: Dims 8.4.2009, 12:19
Цитата(Idsa @  7.4.2009,  20:58 Найти цитируемый пост)
использование ORM мне видится лучшим (по сравнению с типизированным DataSet) 

А есть встроенные средства?

Автор: Idsa 8.4.2009, 13:01
Цитата(Dims @  8.4.2009,  16:19 Найти цитируемый пост)
А есть встроенные средства? 

Какая разница, встроенные или нет? Вопрос должен звучать так: "А есть достойные средства?" smile Есть! Из встроенных - Linq To Sql и Entity Framework , из сторонних - NHibernate. Выбирать все же следует из Entity Framework и NHibernate, ибо Linq To Sql - мертворожденная технология.

Автор: thomas 8.4.2009, 13:48
Settings.Designer.vb
Код

<Global.System.ComponentModel.CategoryAttribute("Application"), _
         Global.System.Configuration.ApplicationScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.SpecialSettingAttribute(Global.System.Configuration.SpecialSetting.ConnectionString), _
         Global.System.Configuration.DefaultSettingValueAttribute("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=""D:\MyProjects\MAIL ID\Mailing1\Mail" & _
            "ing.mdb""")> _
        Public ReadOnly Property MailingConnectionString() As String
            Get
                Return CType(Me("MailingConnectionString"), String)
            End Get
        End Property

<Global.System.ComponentModel.CategoryAttribute("Application"), _
         Global.System.ComponentModel.DescriptionAttribute("Naam van database bestand die zal gebruikt worden in dit programma."), _
         Global.System.Configuration.UserScopedSettingAttribute(), _
         Global.System.Diagnostics.DebuggerNonUserCodeAttribute(), _
         Global.System.Configuration.DefaultSettingValueAttribute(""), _
         Global.System.ComponentModel.EditorAttribute(GetType(clsFileNameEditor), GetType(System.Drawing.Design.UITypeEditor))> _
        Public Property DataBase() As String
            Get
                Return CType(Me("DataBase"), String)
            End Get
            Set(ByVal value As String)
                Me("DataBase") = Value
            End Set
        End Property

Overload in Settings.vb
Код

Namespace My
    
    'This class allows you to handle specific events on the settings class:

    ' The SettingChanging event is raised before a setting's value is changed.
    ' The PropertyChanged event is raised after a setting's value is changed.
    ' The SettingsLoaded event is raised after the setting values are loaded.
    ' The SettingsSaving event is raised before the setting values are saved.
    Partial Friend NotInheritable Class MySettings
        Public Function SetUserOverride() As String
            Me("MailingConnectionString") = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Chr(34) & Me.DataBase & Chr(34)
            Return Me("MailingConnectionString").ToString()
        End Function
    End Class
End Namespace


myDataSet.Designer.vb
Код

 <Global.System.Diagnostics.DebuggerNonUserCodeAttribute()>  _
        Private Sub InitConnection()
            Me._connection = New Global.System.Data.OleDb.OleDbConnection
            Me._connection.ConnectionString = Global.MassPost.My.MySettings.Default.SetUserOverride()
        End Sub

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)