我正在构建一个页面来显示带有分页的客户端数据的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感到茫然。
答案 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变量传递该值。