문제

구성 파일 / 레지스트리 키를 전혀 변경하지 않고 프로그래밍 방식으로 연결 문자열을 설정하고 싶습니다.

이 코드가 있지만 불행히도 "구성은 읽기 전용"으로 예외가 발생합니다.

ConfigurationManager.ConnectionStrings.Clear();
string connectionString = "Server=myserver;Port=8080;Database=my_db;...";
ConnectionStringSettings connectionStringSettings = 
  new ConnectionStringSettings("MyConnectionStringKey", connectionString);
ConfigurationManager.ConnectionStrings.Add(connectionStringSettings);

편집하다:문제는 구성에서 연결 문자열을 읽는 기존 코드가 있다는 것입니다. 따라서 구성 문자열을 수동으로 또는 리소스를 통해 설정하는 것은 유효한 옵션처럼 보이지 않습니다. 내가 정말로 필요한 것은 프로그래밍 방식으로 구성을 수정하는 방법입니다.

도움이 되었습니까?

해결책

나는 이것에 대해 a 내 블로그에 게시하십시오. 비결은 비공개 필드 (및 방법)에 액세스하는 방법으로 반사를 사용하여 가치를 찌르는 것입니다.

예를 들어.

var settings = ConfigurationManager.ConnectionStrings[ 0 ];

var fi = typeof( ConfigurationElement ).GetField( "_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic );

fi.SetValue(settings, false);

settings.ConnectionString = "Data Source=Something";

다른 팁

로컬 SQL Server를 선택하여 사용자가 클릭 한 번 클릭 한 번 클릭 한 번의 연결 문자열을 수정할 수 있도록 동일한 Qustion에 대한 답변을 찾고있었습니다.

아래 코드는 로컬로 사용 가능한 모든 SQL 서버에 연락하여 하나를 선택할 수있는 사용자 양식을 표시합니다. 그런 다음 해당 세척에 대한 연결 문자열을 구성하고 양식의 변수에서 반환합니다. 그런 다음 코드는 구성 파일을 수정하고 저장합니다.

string NewConnection = "";
// get the user to supply connection details
frmSetSQLConnection frm = new frmSetSQLConnection();
frm.ShowDialog();
if (frm.DialogResult == DialogResult.OK)
{
    // here we set the users connection string for the database
    // Get the application configuration file.
    System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
    // Get the connection strings section.
    ConnectionStringsSection csSection = config.ConnectionStrings;
    foreach (ConnectionStringSettings connection3 in csSection.ConnectionStrings)
    {
        // Here we check for the preset string - this could be done by item no as well
        if (connection3.ConnectionString == "Data Source=SQL204\\SQL2008;Initial Catalog=Transition;Integrated Security=True")
        {
             // amend the details and save
             connection3.ConnectionString = frm.Connection;
             NewConnection = frm.Connection;
             break;
        }
    }
    config.Save(ConfigurationSaveMode.Modified);
    // reload the config file so the new values are available

    ConfigurationManager.RefreshSection(csSection.SectionInformation.Name);

    return clsDBMaintenance.UpdateDatabase(NewConnection))
}

이것에 접근하는 또 다른 방법은 컬렉션에서 직접 작동하는 것입니다.

var settings = ConfigurationManager.ConnectionStrings;
var element = typeof(ConfigurationElement).GetField("_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);
var collection = typeof(ConfigurationElementCollection).GetField("bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic);

element.SetValue(settings, false);
collection.SetValue(settings, false);

settings.Add(new ConnectionStringSettings("ConnectionStringName", connectionString));

// Repeat above line as necessary

collection.SetValue(settings, true);
element.SetValue(settings, true);

나는 이것이 나에게 효과가 있음을 알았다 :

Configuration config = WebConfigurationManager.OpenWebConfiguration("~");
ConnectionStringsSection section = config.GetSection("connectionStrings") as         ConnectionStringsSection;
if (section != null)
{
    section.ConnectionStrings["MyConnectionString"].ConnectionString = connectionString;
    config.Save();
}

기존 연결 문자열을 덮어 씁니다.

현재 Dev/Prod 대 테스트 환경에서 다른 연결 문자열을 처리하기 위해 종속성 주입을 사용하고 있습니다. Dev와 Prod 사이에 이동하려면 여전히 WebConfig를 변경해야하지만 테스트의 경우 웹 구성을 보는 기본 구현과 정적 값을 반환하는 대체 테스트 구성이있는 IConnectionsTringFactory 인터페이스가 있습니다. 이렇게 테스트 할 때 공장을 테스트 구현으로 간단히 설정하고 요청한 키의 테스트 연결 문자열을 반환합니다. 그렇지 않으면 WebConfig에서 보입니다.

이것을 Dev vs. PROD의 다른 구현으로 확장 할 수는 있지만 생산 어셈블리에서 ICOntectionstringFactory와 테스트 어셈블리에서 테스트 구현을 단일 구현하는 것이 더 편안합니다.

대신 리소스 파일에 넣을 수 있습니다. ConfigurationManager 클래스의 내장 기능은 없지만 작동합니다.

Resources를 가정합니다 .RESX :

Resources.Default.ConnectionString = "Server=myserver;" // etc

그런 다음 코드에서 :

conn.ConnectionString = Resources.Default.ConnectionString

해킹이야.

주어진 다른 답변 외에도 연결 문자열이 단순히 다른 구성 변수 또는 전체적으로 상수라고 가정하면 사용을 고려할 수 있습니다. sqlconnectionstringBuilder 문자열을 직접 연결하는 대신 클래스.

편집 : UPS, 죄송합니다. 기본적으로 다른 소스에서 연결 문자열 (완료)을 읽고 싶어하는 것을 보았습니다.

.NET Core 2.1 기준으로 이름 지정이 변경된 것 같습니다. David Gardiner의 답변 수정이 방법은 새롭고 오래된 버전을 참조하는 데 효과적입니다.

var settings = configurationManager.ConnectionStrings [0];

var fi = typeof( ConfigurationElement ).GetField( "_bReadOnly", BindingFlags.Instance | BindingFlags.NonPublic );

if(fi == null)
{
  fi = typeof(System.Configuration.ConfigurationElementCollection).GetField("_readOnly", BindingFlags.Instance | BindingFlags.NonPublic);
}

fi.SetValue(settings, false);

settings.ConnectionString = "Data Source=Something";

ConfigurationManager가 익숙합니다 읽다 구성 파일에서.

솔루션은 Conn.ConnectionString을 필요한 Conn 문자열로 간단히 설정하는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top