Проблемы со строками подключения с DAL в отдельном проекте

Изначально я написал уровень доступа к данным внутри папки App_Code на моем веб-сайте. Затем мы разработали веб-сервис в отдельном проекте. Чтобы и веб-сайт, и веб-служба могли получить доступ к одному и тому же DAL, я переместил его в другой проект. У меня есть набор данных с адаптерами таблиц, и для компиляции проекта DAL мне пришлось добавить строку подключения в настройки свойств приложения. Но это означает, что мне нужно перекомпилировать DAL для каждого развертывания. Также у меня может быть 2 или 3 веб-сайта на сервере, использующих один и тот же DAL. Поэтому я хочу установить строку подключения в файле web.config каждого веб-сайта и оставить все как есть. Должен ли я проходить свой код и вносить изменения каждый раз, когда я создаю экземпляр tableadapter? например От

using (MessageQueue adaptor = new MessageQueue())
{
    return adaptor.GetMessages(UserId, MobileId, StartDate, EndDate);
}

to

using (MessageQueue adaptor = new MessageQueue())
using (OracleConnection connection = new OracleConnection(OracleUtilities.ConnectionString))
{
    adaptor.Connection = connection;
    return adaptor.GetMessages(UserId, MobileId, StartDate, EndDate);
}

Или есть способ лучше?

Колин


person Colin    schedule 04.08.2009    source источник


Ответы (2)


Я нашел здесь ответ, который искал:

Необходимая строка подключения приложения ASP.Net

в ответ с_ручить.

Имена строк подключения в web.config должны совпадать с именем строки подключения в app.config, которое содержит полное имя. Так что в моем случае я меняю

<add name="ConnectionStringMainDB" 
     connectionString="<myConnStringHere>"
     providerName="System.Data.OracleClient"/>

to:

<add name="DatabaseAccess.Properties.Settings.ConnectionStringMainDB"
     connectionString="<myConnStringHere>" 
     providerName="System.Data.OracleClient"/>

Никаких других изменений кода не требуется! Спасибо Мухаммеду и первокурснику тоже

person Colin    schedule 05.08.2009
comment
у нас та же проблема ... как мы решаем проблему ... мы добавляем собственный класс, который получает строку подключения из web.config, а затем вручную открывает соединение при использовании tableadapter - person Muhammad Akhtar; 05.08.2009
comment
В проекте nex эта штука очень поможет сполна. - person Muhammad Akhtar; 05.08.2009
comment
Когда вы используете эту технику ... Не могли бы вы рассказать мне, как вы обрабатываете транзакцию при выполнении инерции в нескольких таблицах. - person Muhammad Akhtar; 05.08.2009
comment
Я обнаружил, что транзакции с адаптерами таблиц представляют собой настоящую проблему. Я пробовал подход здесь: weblogs.asp.net/ryanw/ archive / 2006/03/30 / 441529.aspx Но это по какой-то причине сломалось, когда я перенес DAL в отдельный проект, и я также думаю, что это могло быть источником утечек памяти. Я не понимаю плюсов и минусов TransactionScope, поэтому я написал хранимую процедуру для инкапсуляции моей транзакции и добавил этот метод в TableAdapter. - person Colin; 05.08.2009
comment
Я напишу вам электронное письмо, как мы проводим транзакцию ... ваша электронная почта? - person Muhammad Akhtar; 06.08.2009
comment
Я думаю, вам следует задать этот вопрос как еще один вопрос о SO. Я искал ответ на этот вопрос раньше и не понимал всех последствий. Это ссылка, которую я дал вам раньше, которая использует отражение, чтобы обойти проблему, но у меня были проблемы с ней - это могла быть моя реализация, и я не упорствовал с ней. - person Colin; 07.08.2009
comment
Другой способ - использовать частичные классы для доступа к объектам команд TableAdapter. Я играл с этим в течение 5 минут и сдался, поэтому я создал хранимую процедуру в базе данных, которая делает все внутри транзакции, а затем добавил sql для вызова хранимой процедуры в TableAdapter в конструкторе DataSet. - person Colin; 07.08.2009
comment
И снова есть TransactionScope stackoverflow.com/questions/677563/ I тоже попробовал, но компилятор сказал, что мне нужна еще одна клиентская dll оракула или что-то в этом роде, и это меня напугало - person Colin; 07.08.2009

Используйте стандартный раздел конфигурации ConnectionStrings, и вы сможете получить строку подключения, не прибегая к классу утилит:

System.Configuration.ConfigurationManager.ConnectionStrings

Вам все равно придется поместить строку подключения в файл app.config или web.config каждого приложения, которому требуется база данных.

person freshr    schedule 04.08.2009
comment
Класс утилит работает. Он использует ConfigurationManager внутри и правильно извлекает строку подключения из web.config. Но для конструктора наборов данных требуется настройка приложения, а код в настоящее время не использует эту утилиту. Я думаю, мне придется динамически устанавливать каждое соединение с адаптерами таблиц. Или есть способ лучше? - person Colin; 04.08.2009
comment
Я думал, что дизайнер DataSet напрямую использовал этот раздел ConnectionStrings. Но если нет, возможно, вы могли бы использовать заводской шаблон для возврата правильно настроенных адаптеров ... Таким образом, по крайней мере, динамическая настройка адаптеров таблиц выполняется в одном месте. - person freshr; 05.08.2009
comment
Я обнаружил, что это так, если имена совпадают, но имена должны быть полностью квалифицированными - см. Более подробный ответ, который я добавил. Таким образом, нет необходимости в динамической настройке адаптеров стола! - person Colin; 05.08.2009