【问题标题】:Multiple database single application with ASP.NET使用 ASP.NET 的多数据库单一应用程序
【发布时间】:2016-10-03 12:09:35
【问题描述】:

我使用 Visual Studio 和 ASP.NET 4.0 以 MSSQL 2012 Express 作为后端创建了一个应用程序。

最初并没有计划多个数据库,因此我使用单个数据库的单个连接字符串对应用程序进行了相应的编程。

现在,客户的要求发生了变化,他要求每年单独的数据库,DATABASE2015 为 2015 年,DATABASE2016 为 2016 年等等。

我会将结构和数据从上一年的数据库迁移到新年的数据库,这很好。

但是我将如何根据登录时选择的年份为不同的用户连接到不同的数据库?

另外,我在 web.config 中有一个连接字符串,并且我在整个项目的代码端和 html 端都为 asp.net 控件引用了该连接字符串。

请指教。

【问题讨论】:

  • 我知道客户的要求很重要,但你确定客户知道他们在说什么吗?您打算如何管理可能跨越多年的报告/查询?例如,我想要过去 6 个月、12 个月、24 个月或 36 个月的销售报告?如果这是一个坏主意(或看起来是个坏主意),请不要盲目地提交客户请求。
  • 你是对的,但是如果我将所有多年数据存储在单个数据库中,如果我只想搜索 2017 年的数据并且我必须查找之前 10 年的所有记录怎么办年。为了避免这种情况,我认为一种解决方案可能是每年都有单独的数据库。
  • 有很多方法可以优化 DataTables 和使用索引等的查询。在这里可以很好地帮助您的一件事是 Views
  • 会调查一下,谢谢先生。

标签: c# sql asp.net sql-server multiple-databases


【解决方案1】:

正如 Jon P 所说,您的客户要求的内容对您来说将是一场噩梦,而且大量的多年报告将非常困难。但是既然你已经提出了解决方案,所以我想我可以在某个地方指导你如何做到这一点。

在您的 web.config 文件中,您可以将连接字符串设置为,

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

然后在每个用户登录时,根据登录屏幕上的选定年份,您将从某个数据库表中验证用户名和密码。在该表中,您可以创建一个用于存储数据库名称的列,并在成功登录后将该名称存储在会话变量中。

或者您可以使用来自用户表的外键创建另一个表。在您的新表中,您可以每年存储每个用户的数据库名称。

在您的 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));

【讨论】:

  • 感谢您的帮助。这看起来是一个可能的解决方案。我将面临的一个问题是,在许多 aspx 页面上,我有 asp.net 数据控件,这些控件通过连接字符串参数连接到数据库,并且我为所有这些控件分配了一个连接字符串。现在如何将动态数据库连接字符串分配给 aspx 页面上的那些数据控件?
  • 任何应用程序开发的正确方法是任何控件或任何输入或任何想要与您的数据库通信的东西,必须为所有数据库操作调用 DAL 帮助程序。 CRUD,以及连接字符串。所以,你应该把你的 conn str 移到 DAL 中的一个地方,然后每个人都会从那里得到它
  • 你能提供一些上述代码的代码示例吗?我不能让它工作。
  • 我将您的代码放在类文件中。当我从 web 服务访问该功能时,无法获取会话值
猜你喜欢
  • 1970-01-01
  • 2011-01-17
  • 1970-01-01
  • 2019-11-16
  • 2012-06-01
  • 2013-12-11
  • 1970-01-01
  • 1970-01-01
  • 2011-02-11
相关资源
最近更新 更多