2013-07-09 3 views
16

자, 그렇습니다. 이것은 유창한 주제 중 하나입니다. 그러나 지식, 의견 및 현재의 실행에 따라 다음 시나리오를 설정하는 가장 좋은 방법은 무엇입니까?C# 데이터 연결 모범 사례?

광범위한 데이터 입력 응용 프로그램을 구축 중이며 광범위하게 말하면 전체 프로그램의 약 15-25 %를 통합하는 기초 설정 만 있고 부분적으로 설치되는 약 15 개의 양식이 있습니다. (그들은 여전히 ​​작업이 필요합니다.) 백엔드 데이터베이스로 SQL Compact 4.0을 사용하고 있습니다. MMO의 가치가있는 데이터를 저장하지 않기 때문에 더 많은 데이터베이스가 필요하지는 않습니다. 현재로서는 로컬 응용 프로그램입니다. .

메뉴 시스템을 기반으로 다양한 페이지로 바뀌는 단일 창으로 표시되도록 설정할 수 있기를 바랍니다.하지만 그 방법에 대한 좋은 지침서를 찾을 수없는 것 같습니다. 성취 되었으니 아무도 모른다면 나를 가르쳐주세요.

그러나 시나리오는 데이터베이스에 연결하는 방법입니다. 저는 2 개의 SQLCE 데이터베이스를 사용합니다. 하나는 서비스와 스태프를 기반으로하는 상수 데이터를 저장하고, 다른 하나는 끊임없이 변화하는 데이터 또는 첫 번째 데이터베이스를 기반으로 입력 된 새로운 데이터를 저장하는 것입니다. 이 방법을 설정하는 방법에 대한 여러 가지 방법을 보았습니다. 현재 다른 모든 양식에서 상속받은 BaseForm을 사용하고 있습니다. BaseForm 내에서 여러 양식에 공통적 인 메서드와 변수가 있으므로 반복되는 코드의 양이 최소화됩니다.

두 데이터베이스에 대한 연결 문자열과 두 데이터베이스에 대한 연결을 여는 두 가지 방법이 포함됩니다. 그래서 같이 : 나는 열려있는 연결을 필요로 할 때마다

internal SqlCeConnection dataConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_data.sdf"); 
internal SqlCeConnection logConn = new SqlCeConnection(@"Data Source = |DataDirectory|\opi_logs.sdf"); 
internal SqlCeCommand command; 

internal void openDataConnection() // Opens a connection to the data tables 
     { 
      try 
      { 
       if(dataConn.State == ConnectionState.Closed) 
        dataConn.Open(); 
      } 
      catch(SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

     internal void openLogConnection() // Opens a connection to the log tables 
     { 
      try 
      { 
       if(logConn.State == ConnectionState.Closed) 
        logConn.Open(); 
      } 
      catch (SqlCeException ex) 
      { 
       MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
      } 
     } 

그리고 난 그저 내가에 대한 액세스를 필요로하는 데이터베이스에 해당하는 열린 연결 메소드를 호출 한 다음 마지막으로 성명을 닫습니다. 이 방법으로 연결이 필요할 때 바로 열리지 않습니다. 물론 이것은 열린 연결 방법에 대한 많은 호출이 있음을 의미합니다. 이렇게하면 이런 종류의 시나리오를 구현하는 가장 좋은 방법입니까 아니면 더 좋은 방법이 있습니까?

양식이로드되는 즉시 연결을 열고 양식을 닫을 때 닫는 것이 더 낫습니까? 한 번에 여러 양식이 열려 있고 각각 하나가 데이터베이스에 대한 열린 연결을 필요로하는 인스턴스가 있으므로 하나를 닫으면 다른 인스턴스가 제대로 작동하지 않을 수 있습니까? 아니면 응용 프로그램을 시작할 때 두 데이터베이스 모두에 대한 연결을 열어야합니까? 모든 입력을 부탁드립니다. 감사.

+1

사용 정책에 대한이 질문 참조 http://stackoverflow.com/q/212198/1193596 – Amicable

답변

51

연결은 .NET에서 풀링되므로 일반적으로 연결을 다시 만드는 것은 비용이 많이 드는 작업이 아닙니다. 그러나 연결을 장시간 열어두면 문제가 발생할 수 있습니다.

대부분의 "모범 사례"는 가능한 한 빨리 (모든 SQL을 실행하기 직전에) 연결을 열어 가능한 빨리 (데이터의 마지막 비트가 추출 된 직후) 연결을 종료하도록 알려줍니다.

이 작업을 자동으로 수행하는 효과적인 방법은 using 문 함께 :

using (SqlConnection conn = new SqlConnection(...)) 
{ 
    using(SqlCommand cmd = new SqlCommand(..., conn)) 
    { 
     conn.Open(); 
     using(DataReader dr = cmd.ExecuteReader()) // or load a DataTable, ExecuteScalar, etc.  
     { 
      ... 
     { 
    } 
} 

그런 식으로, 자원 닫히고 예외가 발생해도 처리된다.

요약하면 앱을 열거 나 각 양식을 열 때 연결을 열지 않는 것이 가장 좋은 방법 일 것입니다.

+0

고맙습니다. 저는 using 문을 추가하고 연결 방법을 제거하는 것을 더 명확하고 효율적인 방법으로 생각했습니다. 방금 내 코드를 정리하는 일에 익숙하지 않았습니다. 테스트를 위해 try/catch 메소드를 사용하기 만하면됩니다. –

-10

당신이 데이터베이스에서 물건을 필요로하기 때문에 응용 프로그램을 시작할 때 열어 보는 것이 더 낫다고 생각합니까? 저는 전문가가 아니며 제 의견입니다 ... 비슷한 응용 프로그램을 프로그래밍하고 메인 양식의 시작 부분에 연결. 별도의 연결을 만든 유일한 양식은 로그인 양식이었습니다.

+7

투기 답변을 게시하지 마십시오. 실제로 Microsoft에서 권장하는 우수 사례가 있습니다. – Mgetz

+0

@Mgetz 당신은 이것이 추측이라는 것에 맞습니다. 그리고 따라야 할 기준이 분명히 있습니다. 중요한 점은 표준이기 때문에 소프트웨어 시스템에 적합하지 않다는 것입니다. 이것이 당신의 시스템을 더 좋게 만든다면 어떻게 그렇게 되었습니까? 그것은 훨씬 더 좋은 토론을 불러 일으킬 것입니다. 나는 실행을 마칠 때까지 열린 데이터베이스 연결로 작성한 여러 응용 프로그램을 가지고 있지만 좋은 이유가 있습니다. –