2009-05-06 5 views
0

인라인 SQL 호출과 복사/붙여 넣기 기능을 사용하여 거의 독점적으로 작성된 ASP.Net 2.0 웹 응용 프로그램에 데이터 액세스 계층을 추가하는 중입니다. 비즈니스 관련 문제로 인해 한 번에 응용 프로그램의 작은 부분을 다시 만들 수 있습니다 (거대한 재 디자인을 해결할 수는 없습니다). 그래서 느슨하게 연결될 때까지 특정 디자인 결정을해야합니다. 큰 변화를 만들어 적절하게 테스트해라.DAAB를 사용하여 동적 연결 문자열 처리

필자는 엔터프라이즈 라이브러리 데이터 액세스 응용 프로그램 블록을 데이터 액세스 계층의 배관으로 사용하기로 결정했습니다. 이전의 설계 결정으로 인해 문제가 발생했습니다. 현재 사용자가 제공 한 계정 ID를 기반으로 관리 데이터베이스에서 응용 프로그램의 "기본"연결 문자열을 가져와 응용 프로그램을 단일 설치하여 여러 데이터베이스에 액세스 할 수 있습니다. 내 문제는 해당 연결 문자열 (또는 계정 ID)을 DAL로 가져 오는 최상의 방법을 찾는 데 집중합니다.

Public Shared Function GetResultsByKeywords(ByVal key1 As String, ByVal key2 As String, ByVal key3 As String, ByVal key4 As String) As DataTable 
    Dim db As SqlDatabase = New SqlDatabase(Connection.GetConnectString()) 
    Dim dt As DataTable = New DataTable 

    Using dr As IDataReader = db.ExecuteReader("sel_eHELP_ITEMS", key1, key2, key3, key4) 
     dt.Load(dr) 
    End Using 

    Return dt 
End Function 

연결 : 내 현재 해킹-방법은 거기에서 연결 문자열을 얻을 후 다음과 같은 방식으로 DAAB를 사용하는 것입니다, 그래서

이전 구현은 쿠키에 암호화 된 연결 문자열을 저장했다. GetConnectString()이 쿠키에서 연결 문자열을 가져 오는 중입니다.

나는 이것이 가장 좋은 방법이 될 수 없다는 것을 안다. 나는 그것을 고칠 필요가있다. 그러나 나는 그것을 끝내기위한 "올바른"방법으로 고심하고있다. 어쩌면 내가 연결 문자열로 초기화하고 다른 모든 클래스를 상속받을 수있는 기본 클래스를 만들지 만, 어떻게 보이게 될지, 그리고 그 클래스의 인스턴스를 처음 초기화 할 위치를 모르겠습니다. DAL 기능을 사용하기 전에 모든 페이지에서?

모든 안내를 받으실 수 있습니다. 고맙습니다.

업데이트

나를 명확히하자. 최대 3 ~ 4 개의 다른 연결 문자열이 설치에 사용됩니다. "계정 ID"는 사용자 ID가 아니며 여러 사용자가 본질적으로 연결할 데이터베이스를 지정하는 데 사용됩니다.

답변

2

편집 : 당신의 최신 업데이트와

, 나는 여전히 DAAB http://davidhayden.com/blog/dave/archive/2006/01/23/2744.aspx

내가 엔터 해방의 문서를 열어/찾는 어려움에 봉착를 사용하여 구성을 조사하는 것이 좋습니다,하지만 난 그것을 있는지 것 SqlConnection 개체의 ChangeDatabase 메서드에 해당합니다. http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.changedatabase.aspx

여기에 한 가지 방법이 있습니다. 귀하의 DAL이 전환 DB 요구 사항에 대해 알고 있어야한다고 생각하기 때문에 귀하의 DAL을 생성자의 매개 변수로 ConnectionString으로 설정하겠다고 생각합니다. 래퍼 메서드/속성을 사용하여 해당 요구 사항을 숨기거나 캡슐화하고 앱에서 사용하려는 DAL의 인스턴스를 가져옵니다.

(는 C#을 용서하시기 바랍니다)

public class MyDAL 
{ 
    private string _connectionString; 

    public MyDAL(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public int MyDatabaseCall() 
    { 
     using (SqlConnection conn = new SqlConnection(_connectionString)) 
     { 
      using (SqlCommand cmd = new SqlCommand("my sql", conn)) 
      { 
       conn.Open(); 
       using (SqlDataReader reader = cmd.ExecuteReader()) 
       { 
        //...data access 
        return 0; 
       } 
      } 
     } 
    } 
} 

public class MyApp 
{ 
    public static Dictionary<string, MyDAL> myDatabases = new Dictionary<string, MyDAL>(); 

    public string GetConnectionString(string database) 
    { 
     return System.Configuration.ConfigurationManager.ConnectionStrings[database].ConnectionString; 
    } 

    public void StartUp() // Global.asax Application_Start ? 
    { 
     myDatabases.Add("Database1", new MyDAL(GetConnectionString("Database1"))); 
     myDatabases.Add("Database2", new MyDAL(GetConnectionString("Database2"))); 
     myDatabases.Add("Database3", new MyDAL(GetConnectionString("Database3"))); 
    } 

    public MyDAL DataAcccessLayer 
    { 
     get 
     { 
      string usersDB = FigureOutUsersDatabase(); 
      return myDatabases[usersDB]; 
     } 
    } 

    public void UseSomeData() 
    { 
     var myData = DataAcccessLayer.MyDatabaseCall(); 
     //Do Stuff 
    } 
} 

하는 데 도움이 희망, 행운을 빌어 요! 그리고 매우 조심하십시오 쿠키에 넣어. ;)

+0

감사합니다. 이것은 정확하게 문제를 해결하는 방법이 아니었지만 여전히 내가 사용한 기본 개념을 보여줍니다. 쿠키에 더 이상 연결 문자열이 저장되지 않습니다! – smathson