2017-02-14 1 views
0

내 프로젝트에서는 ConnectionString 클래스를 사용하고 있습니다. 내클래스를 Winforms 응용 프로그램에서 동적으로 변경하고 싶습니다.동적으로 ConnectionString 클래스를 변경하는 방법

나는 형태 (frmServerCon)를 만들려면 어디 수있는 텍스트 상자에 입력 새로운 가치, 데이터 소스, 초기 카탈로그, 이름비밀번호있다. "저장"버튼을 클릭하면이 새로운 설정을 ConnectionString 클래스에 저장하고 연결 버튼을 클릭하여 저장하기 전에 SQL Server에 대한 새 연결 값이 작동하는지 확인해야합니다.

는 지금과 같은 내 ConnectionString 클래스의 모양을

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace 7KProject 
{ 
    class ConnectionString 
    { 
     public string DBConn = "Data Source=TCP/IP,PORT;Initial Catalog=DataBase;User ID=user;Password=*******"; 

    } 
} 

나는 어떤 해결책을 찾을 수 없습니다입니다. 몇 가지 작업 코드로 도움을받을 수 있다면 좋을 것입니다. 죄송합니다. 예제 코드가 없습니다.

감사합니다.

+3

휠을 다시 발명하지 마십시오. 이미 ['SqlConnectionStringBuilder']가 있습니다 (https://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder (v = .110) .aspx) 당신이하려는 일을 꽤 많이 수행합니다. –

답변

0

다른 방법으로이 문제를 해결할 수 있습니다. 희망을 가지고 다른 사람들을 도울 수 있기를 바랍니다. 개선이 있다면 제안을 부탁드립니다.

난 내 ConnectionString을 클래스로

<connectionStrings> 
    <add name="DBConn" connectionString="Data Source=Servername;Network Library = DBMSSOCN;Initial Catalog=database;User ID=user;Password=password" providerName="System.Data.SqlClient"/> 
    </connectionStrings> 

을 ConnectionString을의 app.config 호출하고있다.

public class ConnectionString 
    { 
     public string DBConn = ConfigurationManager.ConnectionStrings["DBConn"].ToString(); 
    } 

백엔드에는 app.config connectionString에 새 값을 추가하기위한 새로운 서버 연결 정보를 추가하는 양식이 만들어졌습니다. SvrConfig 양식

using System; 
using System.Windows.Forms; 
using System.Configuration; 
using System.Reflection; 

namespace B4_HRM_System 
{ 
    public partial class SvrConfig : Form 
    { 
     public SvrConfig() 
     { 
      InitializeComponent(); 
     } 

     private void btnsave_Click(object sender, EventArgs e) 
     { 
      try 

      { 

       if (txtserver.Text == "") 
       { 
        MessageBox.Show("Please enter Server Name.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        txtserver.Focus(); 
        return; 
       } 



       if (txtdb.Text == "") 
       { 
        MessageBox.Show("Please enter Database.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        txtdb.Focus(); 
        return; 
       } 

       if (txtuser.Text == "") 
       { 
        MessageBox.Show("Please enter Username.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        txtuser.Focus(); 
        return; 
       } 



       if (txtpass.Text == "") 
       { 
        MessageBox.Show("Please enter Password.", "7KProject", MessageBoxButtons.OK, MessageBoxIcon.Error); 
        txtpass.Focus(); 
        return; 
       } 

       string DBConn = "Data Source={0};Initial Catalog={1};User ID={2};Password={3}"; 
       DBConn = string.Format(DBConn, txtserver.Text, txtdb.Text, txtuser.Text, txtpass.Text); 
       Configuration config = ConfigurationManager.OpenExeConfiguration(Assembly.GetExecutingAssembly().Location); 
       ConnectionStringsSection connSection = (ConnectionStringsSection)config.GetSection("connectionStrings"); 
       connSection.ConnectionStrings["DBConn"].ConnectionString = DBConn; 
       config.Save(ConfigurationSaveMode.Modified); 
       ConfigurationManager.RefreshSection("AppSettings"); 
       MessageBox.Show("Successfully Completed", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information); 
       } 

      catch (Exception ex) 

      { 

       MessageBox.Show(ex.Message, ex.GetType().ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error); 

      } 
     } 

     private void btnexit_Click(object sender, EventArgs e) 
     { 
      this.Hide(); 
      b4login frmb4login = new b4login(); 
      frmb4login.Show(); 
     } 

     } 
} 

하지만 connectionString을 저장할 때마다 응용 프로그램을 다시 시작해야합니다. 어떤 방법이나 개선 SvrConfig 양식을 닫을 때 업데이트/응용 프로그램을 다시 시작할 필요가 없으므로 로그인 폼을 표시하기 전에 app.config 파일에서 connectionString 새로 고치십시오.

0

코드를 작성하는 것과 같은 방식으로하는 것은 좋지 않지만 클래스의 필드가 아닌 속성을 사용해야합니다. 다른 곳에서 코드에서 다음

public class ConnectionString 
{ 
    public string DBConn { get; set; } = "your default string here"; 
} 

가져 오거나 별도로 값을 편집하려면이

var connectionString = new ConnectionString(); 
var dbConn = connectionString.DBConn; // get the value 
connectionString.DBConn = "new string"; // set it with a new value 
0

같은 속성을 설정할 수 있습니다, 가기 :

그래서 수업이 방법을 업데이트 그들을 별도로. 이런 식으로 뭔가가 :

public class ConnectionString 
{ 
    public string DataSource { get; set; } 
    public string InitialCatalog { get; set; } 
    public string UserID { get; set; } 
    public string Password { get; set; } 

    public ConnectionString(string dataSource, string initialCatalog, string userID, string password) 
    { 
     DataSource = dataSource; 
     InitialCatalog = initialCatalog; 
     // etc. 
    } 

    public override string ToString() 
    { 
     return string.Format("Data Source={0};Initial Catalog={1};User ID={2};Password={3}", DataSource, InitialCatalog, UserID, Password); 
    } 
} 

그런 다음 당신은 당신이 원하는 값으로 ConnectionString 객체를 생성 당신이 원하는 그러나이 값을 수정하고 해당 개체의 결과 연결 문자열을 원하는 시간 당신은 단지 인스턴스에 .ToString()를 호출 할 수 있습니다 개체의

기본적으로 여러 값이 포함 된 문자열이있는 경우 언제든지 에 대한 유혹에 저항하여이 값을 조작하는 문자열을 수정하십시오. 별도의 값이있는 경우 별도의 변수가 있습니다. 별도의 것들을 분리하십시오. 결과 문자열은 필요할 때만 빌드하십시오.

+0

David 저는 여전히 멍청한 녀석입니다. 그리고 어떻게이 문제를 해결할 수 있을까요? 나는 클래스와 폼을위한 예제 코드를 찾고있다. – Bukhalifa

+0

@Bukhalifa : "값 설정"이 의미하는 것은 제공된 값을 클래스 수준 속성에 할당하는 것입니다. 답안의 코드를 예제로 업데이트했습니다. – David

0

데이터베이스 자격 증명을 저장할 구성 파일을 만듭니다. 응용 프로그램이 시작되면 자격 증명을 읽고 연결 문자열을 작성합니다. 그것을 저장하고 dbContext를 생성하는 데 사용하십시오. 양식을 사용하여 구성 파일을 변경하십시오.사용

Name   Type Scope Value 
MyConnection string User Data Source=TCP/IP,PORT;Initial Catalog=DataBase;User ID=user;Password=*******" 

읽기 :

속성> 설정 :

0

당신은 사용자 문자열 설정을 만들 수

string MyConn = Properties.Settings.Default.MyConnection; 

및 저장은 사용 :

Properties.Settings.Default.MyConnection = "..."; 
Properties.Settings.Default.Save(); 
,

불행히도 (ConnectionString) 유형은 응용 프로그램 범위 (읽기 전용)이므로 User-scoped "string"을 대신 사용하십시오. 또한 비밀번호를 저장하려면 해당 문자열을 암호화/해독하는 것이 가장 좋습니다.

관련 문제