2016-10-03 3 views
1

Я создал приложение с Visual Studio и ASP.NET 4.0 с MSSQL 2012 Express в качестве бэкэнд.Несколько приложений с одной базой данных с ASP.NET

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

Теперь требования клиента изменились, и он запрашивает отдельную базу данных за каждый год, DATABASE2015 на год 2015, DATABASE2016 на год 2016 и так далее.

Я перенесу структуру и данные из базы данных предыдущего года в базу данных нового года, и это прекрасно.

Но как я могу подключиться к другой базе данных для разных пользователей в соответствии с их выбором года во время входа в систему?

Кроме того, у меня есть единственная строка подключения в web.config, и я ссылался на эту строку соединения во всем моем проекте как на стороне кода, так и на стороне html для элементов управления asp.net.

Просьба сообщить.

+2

Я знаю, что требования клиента очень важны, но вы уверены, что клиент знает, что они говорят здесь? Как вы планируете управлять отчетами/запросами, которые могут охватывать несколько лет? Например, я хочу получить отчет о продажах за последние 6 или 12 или 24 или 36 месяцев? Не слепо отправлять запрос клиента, если это плохая идея (или кажется плохая идея). –

+0

Вы правы, но если я храню все данные за один год в одной базе данных, что делать, если я хочу искать только данные за 2017 год, и я должен искать все записи, скажем, за предыдущие 10 лет. Чтобы этого избежать, я думал, что для одного решения может быть отдельная база данных для каждого года. – Hemal

+0

Существует множество способов оптимизации данных и запросов с индексами и т. Д. Одна вещь, которая может вам помочь, - [Views] (https://msdn.microsoft.com/en-AU/library/ms187956.aspx) –

ответ

1

Как сказал Джон П, то, что ваш клиент спрашивает, станет для вас кошмаром, и вам будет сложно провести многолетнюю отчетность в течение нескольких лет. Но так как вы попросили решение, поэтому я думаю, что смогу направить вас куда-нибудь, как это сделать.

В вашем web.config файл, который вы могли бы сделать строку соединения, как,

<add name="YourConnStr" connectionString="Data Source=.;Initial Catalog={0};UID=sa;PWD=password;" 
    providerName="System.Data.SqlClient" /> 

Тогда на каждом входе пользователя в систему как за выбранный год на экране входа в систему вы бы проверки имени пользователя и пароля от некоторые таблицы базы данных. В этой таблице вы можете создать столбец для хранения имени базы данных и при успешном входе в систему сохранить это имя в переменной сеанса.

Или вы можете сделать другую таблицу с внешним ключом из таблицы Users. В вашей новой таблице вы можете хранить имена баз данных для каждого пользователя в год.

В вашем DAL, при получении строки подключения для SqlConnection, вы могли бы сделать, как,

var db = System.Web.HttpContext.Current.Session["dbName"].ToString(); // from session variable 
var connection = System.Configuration.ConfigurationManager.ConnectionStrings["YourConnStr"].ConnectionString; 
return new SqlConnection(string.Format(connection, db)); 
+0

Благодарим вас за помощь. Это похоже на возможное решение. Одна из проблем, с которыми я столкнулся, - это на многих страницах aspx, у меня есть элементы управления данными asp.net, и эти элементы управления подключены к базе данных через параметр connectionstring, и я могу установить строку соединения со всеми этими элементами управления. Теперь, как я могу назначить эту строку подключения динамической базы данных к этим элементам управления данными на страницах aspx? – Hemal

+1

Правильный способ разработки любого приложения заключается в том, что любой элемент управления или любой вход или что-либо, что хочет связываться с вашей базой данных, должен вызывать вспомогательный DAL для всех операций БД. CRUD и строка подключения. Итак, u должен перемещать ur conn str на одно место в DAL, а затем все получат его оттуда –

+0

Отлично, и большое вам спасибо – Hemal