2009-10-19 3 views
0

오랜 시간 동안 내 클라이언트에 대한 데이터 투영을 수행하는 응용 프로그램이 있습니다. 클라이언트가 프로덕션 데이터를 엉망으로 만들지 않고 다른 시나리오에서 '재생'할 수있게하려면 프로덕션 데이터베이스의 복사본 인 임의의 지점에서 대체 데이터베이스 (기본적으로 What-If 시나리오)를 선택할 수 있습니다. 주어진 시간. 현재, 세션 상태에 저장된 사용자 선택에 따라 서버 이름과 데이터베이스 이름을 핫 스왑 할 연결 문자열에 문자열 바꾸기를 기본적으로 수행하는 코드가 있습니다.세션 변수를 기반으로하는 Dynamic Connecton 문자열

이 방법은 제가하고있는 일에 잘 작동합니다. 그러나 모든 레이어에서 이러한 선택을 전달해야합니다. 여기에 내 질문 : 나는 백그라운드 에서이 '스위칭'을 처리하고 내가 표준 Asp.Net 응용 프로그램에서처럼 연결 문자열을 사용할 수 있도록 사용자 지정 연결 문자열을 만들 수 있기를 바랍니다.

즉, 많은 asp.net 도구는 연결 문자열 이름을 해당 생성자의 일부로 허용합니다. 나는 그 도구를 활용할 수 있기를 원하지만 현재 연결 문자열을 구축하는 방법의 b/c를 수행 할 수 없습니다. 사용자 세션 수준에서이 동작을 지원할 수있는 방법이 있습니까? 그냥 크게 연결 문자열의 이름을 수 있다면, 그 큰 이름 주위에 통과

답변

0

이 문제를 처리 할 수있는 여러 가지 방법이 있습니다.

일부 사용자는 연결 문자열을 유지해야하는 web.config 파일을 별도로 복사하고 빌드 후 이벤트를 사용하여 "릴리스 구성 (release configuration)"을 기반으로 관련 web.config 파일을 복사 할 수 있습니다 "당신은 Visual Studio에서 사용하고 있습니다.

이 방법은 Scott Gu의 blogged about이며, 또한 others입니다. 처음 당신의 ASP를 배포 할 때
How do you deal with connection strings when deploying an ASP.NET site?

지금, 위의 IS가 큰 방법이다 :
또한,이 StackOverflow의 질문을 참조하십시오.이 작업을 수행하려면 NET 응용 프로그램은, 그러나, 응용 프로그램이 이미 배포 할 때, 당신은이 편리한 메커니즘을 사용할 수 있습니다 : ConnectionString Trick

그것은 당신이 이미이 매우 비슷한 일을하고있는 것처럼 소리, 그리고 만약 않습니다 런타임시 데이터베이스를 동적으로 전환 할 수 있기를 원한다면 최선의 방법은 코드 내에서 연결 문자열을 "전환"하는 것입니다. 물론 여기있는 속임수는 응용 프로그램의 나머지 부분에 데이터베이스 연결 문자열을 제공하는 작업을 응용 프로그램의 한 곳에서 처리하도록 단순화하는 것입니다.

아마도 이것을 처리하는 가장 좋은 방법은 System.Configuration.ConfigurationSection 클래스에서 파생 된 클래스를 사용하여 web.config에서 검색하려는 모든 값을 검색하는 것입니다. 이렇게하면 한 위치에서 반환 된 실제 값을 "전환"하는 데 필요한 로직 (예 : 위의 "연결 문자열 기반 머신 이름"트릭)을 캡슐화하고 사용자 정의 클래스의 "connectionstring "연결 문자열을 매개 변수로 요구하는 다른 구성 요소 생성자의 속성. 실제 연결 문자열 값이 변경 될 때이를 변경하지 않아도됩니다. 사용자 정의 구성 섹션에 대한

일부 좋은 자원은 다음과 같습니다

How to: Create Custom Configuration Sections Using ConfigurationSection
나는이 방법으로 간주 한 Creating Custom Configuration Sections in Web.config Using .NET 2.0's Configuration API
Custom Configuration Sections in 3 Easy Steps

+0

정보 주셔서 감사합니다! 연결 문자열 트릭을 알고 있지만, 제 경우는 조금 다릅니다. 사용자에 따라 다른 연결 문자열이 필요하며 잠재적으로 응용 프로그램에서 대상으로 지정할 데이터베이스를 선택해야합니다. 즉, 단순히 Application_Start 중에 설정할 수있는 배포 스위치 또는 설정이 아닙니다. 사용자 지정 구성 섹션을 만드는 것이 적합 할 수 있습니다. 현재 연결 문자열 구성 섹션을 직접 재정의 할 수있는 경우. 나는 그렇게 할 수있는 정보를 찾고 있지만 아직 아무 것도하지 않습니다. – Nathan

0

보인다 : 생산, 테스트 등

다음의 모든 연결 문자열을 가질 수 귀하의 Web.config, 방금 이름을 기반으로 연결 문자열을 검색하십시오. ,

SqlConnection conn = new conn(ConfigurationManager.ConnectionStrings[Session["SelectedDB"]].ToString()); 
+0

그러나, 산란의 과정은 "만약에"를 내 통제 불능이며, 모든 스폰에 대해 이러한 설정을 수동으로 추가하지 않아도됩니다. 이것은 좋은 접근 방법이지만 나는 그것을 최후의 수단으로 생각하고 있습니다. – Nathan

0

당신은 사용자 정의 개체를 만들 수 ToString 메서드를 오버라이드 (override), 그 개체에 대한 매개 변수로 myObject.ToString()를 전달합니다

<add name="Production" connectionString="Database=Widgets;Server=SQL-PROD;Trusted_Connection=yes" /> 
<add name="Test" connectionString="Database=AltWidgets;Server=SQL-TEST;Trusted_Connection=yes" /> 

당신이 당신의 연결을, 그냥 통과 예 :

class CustomObject 
{ 
    override public string ToString() 
    { 
     // In here would go whatever logic you use to decide 
     // which conn string should be returned 
     return "Data Source=server; User ID=user; Password=password;" + 
        "Initial Catalog=" + Session["DBName"]; 
    } 
} 

그런 다음이 기능을 사용하려면

CustomObject co = new CustomObject(); 
SqlConnection conn = new SqlConnection(co.ToString()); 
+0

이것은 내가 지금하고있는 접근법과 매우 유사합니다. 불행히도, 나는 그것이 현재 상황에서 효과가 있다고 생각하지 않는다. 많은 개체는 연결 문자열 이름 대신 연결 문자열 이름을 매개 변수로 사용합니다. 기본적으로이 매개 변수는 내 제어에서 제외됩니다. – Nathan

+0

같은 일을 할 수 있지만 연결 문자열을 반환하는 대신 연결 문자열 이름을 반환 하시겠습니까? conn 문자열 이름을 허용하는 어떤 종류의 객체를 말하고 있습니까? 이러한 사용자 지정 개체 또는 ASP.Net 컨트롤에 내장되어 있습니까? –

+0

이들은 Asp.Net SqlCacheDependency Object와 같은 asp.net 컨트롤로서, 스키마에 등록 된 Name (연결 문자열 이름을 나타냄)을 받아들입니다. 연결 문자열 이름을 사용하여 동일한 작업을 수행 한 경우 동적이 아니라 web.config에 연결 문자열의 각 인스턴스를 등록해야합니다. 이것은 JustLoren의 제안과 비슷합니다. – Nathan

0

내가 System.Data.SqlClient.SqlConnectionStringBuilder 당신의 요구에 완벽하게 될 것이라 생각합니다.

+0

이것은 내 현재 구현과 매우 유사하지만 현재 요구 사항과 일치하지 않습니다. 기본적으로, 나는 연결 스트링 이름을 받아들이는 콘트롤러를 생성자의 일부로 사용하려고하는데, 이는 연결 스트링의 빌딩 부분을 내 손에서 빼앗아 간다. 내 자신의 목적에 맞게 기본 빌드 프로세스를 재정의하고 싶지만 이것이 어떻게 수행 될지 잘 모르겠습니다. 말이 돼? – Nathan

관련 문제