C# 正在修改ASP.NET GridView的连接字符串->;BLL->;运行时的DAL

C# 正在修改ASP.NET GridView的连接字符串->;BLL->;运行时的DAL,c#,pagination,connection,objectdatasource,C#,Pagination,Connection,Objectdatasource,我正在构建一个页面来显示带有分页的客户端数据的GridView。我的aspx页面有一个GridView,它的DataSourceID设置为ObjectDataSource。ObjectDataSource绑定到BLL,BLL通过DAL访问数据。我在指向静态数据库时启动并运行了整个程序。但是,每个客户机的数据都存储在自己的数据库中。下一步是根据客户端登录修改DAL的ConnectionString 我已经将选项ConnectionModifier设置为“Public”配置了DAL TableAda

我正在构建一个页面来显示带有分页的客户端数据的GridView。我的aspx页面有一个GridView,它的DataSourceID设置为ObjectDataSource。ObjectDataSource绑定到BLL,BLL通过DAL访问数据。我在指向静态数据库时启动并运行了整个程序。但是,每个客户机的数据都存储在自己的数据库中。下一步是根据客户端登录修改DAL的ConnectionString

我已经将选项ConnectionModifier设置为“Public”配置了DAL TableAdapter。我的BLL可以修改DAL的连接字符串,但是我不知道如何将客户机数据库名称传递给BLL

public class PDFDocumentsBLL {
  private PDFTableAdapter _pdfdocumentsadapter = null;
  protected PDFTableAdapter Adapter {
    get {
      if ( _pdfdocumentsadapter == null ) {
        _pdfdocumentsadapter = new PDFTableAdapter();
        _pdfdocumentsadapter.Connection = new System.Data.SqlClient.SqlConnection(
          ConfigurationManager.ConnectionStrings["template"].ConnectionString.Replace( "TEMPLATE", "TESTCLIENT" )
          );
      }
      return _pdfdocumentsadapter;
    }
  }
  ...
}

我想用一个变量替换上面代码中的字符串“TESTCLIENT”,但我不知道如何将此信息传递给BLL。

您可以创建某种数据库名称提供程序,它将根据用户名返回数据库名称,如

public class DataBaseNameProvider
{
   public string GetDataBaseName()
   {
      var userName = Membership.GetUser().UserName;
      return GetDatabaseNameByUserName(userName);
   }
}
从你的BLL给那个班打电话


如果您不想在BLL中使用ASP.NET内容,因为您不想添加额外的依赖项,那么您仍然可以在BLL周围创建一个包装器,该包装器将识别成员身份,并在那里创建您的BLL传递用户名。

如果您使用的是Windows身份验证,那么您只需使用

ConfigurationManager.ConnectionStrings[WindowsIdentity.GetCurrent().Name]

为每个用户检索整个连接字符串可能是一种很好的做法,它使它更加灵活,因此如果需要,您可以使用完全不同类型的数据库。

我最后要做的是在我的BLL中添加一个PDFDB属性:

public class PDFDocumentsBLL {
  private PDFTableAdapter _pdfdocumentsadapter = null;
  public string PDFDB = "PDF_TEMPLATE";
  protected PDFTableAdapter Adapter {
    get {
      if ( _pdfdocumentsadapter == null ) {
        _pdfdocumentsadapter = new PDFTableAdapter();

        _pdfdocumentsadapter.Connection = new System.Data.SqlClient.SqlConnection(
          ConfigurationManager.ConnectionStrings["pdf"].ConnectionString.Replace( "PDF_TEMPLATE", PDFDB )
          );
      }
      return _pdfdocumentsadapter;
    }
  }
}

然后,我修改了GetBy/FillBy函数,将DB作为附加参数,并将ObjectDataSource配置为从会话变量传入该值。

这需要为每个客户端向Web.config添加一个条目,而不是最易于管理的解决方案。