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

时间:2012-01-18 21:35:58

标签: c# pagination connection objectdatasource

我正在构建一个页面来显示带有分页的客户端数据的GridView。我的aspx页面有一个GridView,其中DataSourceID被设置为ObjectDataSource。 ObjectDataSource绑定到BLL,BLL又通过DAL访问数据。在指向静态数据库的同时,我完成了整个操作。但是,每个客户端的数据都存储在自己的数据库中。下一步是根据客户端登录修改DAL的ConnectionString。

我已将DAL TableAdapter配置为选项ConnectionModifier设置为'Public'。我的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感到茫然。

3 个答案:

答案 0 :(得分:1)

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

public class DataBaseNameProvider
{
   public string GetDataBaseName()
   {
      var userName = Membership.GetUser().UserName;
      return GetDatabaseNameByUserName(userName);
   }
}

从你的BLL打电话给那个班级。

如果您不想在BLL中使用ASP.NET内容,因为您不想添加其他依赖项,您仍然可以在BLL周围创建一个包含成员资格的包装器并创建BLL传递用户名。

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

我最终做的是向我的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以从Session变量传递该值。