2010-05-21 8 views
0

이것은 (나에게 어쨌든) 흥미 롭습니다. 그리고 누구든지이 행동에 대한 좋은 대답과 설명이 있는지 알고 싶습니다.정적/싱글 톤 리소스 참조 블록 사용

싱글 톤 데이터베이스 개체 (또는 정적 데이터베이스 개체)가 있다고 가정하면 Foo 클래스에 저장되어 있다고 가정합니다.

public class Foo 
{ 
    public static SqlConnection DBConn = new SqlConnection(ConfigurationManager.ConnectionStrings["BAR"].ConnectionString); 
} 

그런 다음 호출하고 연결을 폐기의 유용성을 인식하고 있다고 말할 수 있습니다 (이 예를 들어 척이 그림의 목적을위한 일회성 사용). 따라서 Dispose() 호출을 처리하기 위해 'using'블록을 사용하기로 결정했습니다.

using (SqlConnection conn = Foo.DBConn) 
{ 
    conn.Open(); 
    using (SqlCommand cmd = new SqlCommand()) 
    { 
     cmd.Connection = conn; 
     cmd.CommandType = System.Data.CommandType.StoredProcedure; 
     cmd.CommandText = "SP_YOUR_PROC"; 

     cmd.ExecuteNonQuery(); 
    } 
    conn.Close(); 
} 

"ConnectionString 속성이 초기화되지 않았습니다"라는 연결에 대한 호출에서 예외가 발생합니다. app.config/web.config에서 연결 문자열을 가져 오는 데는 문제가 없습니다. 디버그 세션에서 조사 할 때 Foo.DBConn은 null이 아니지만 빈 특성이 있음을 알 수 있습니다.

왜 이런가요?

답변

0

아마도 web/app.config에 해당 connectionStrings 노드가 없습니까? 주제 중

<connectionStrings> 
<add name="BAR" 
    connectionString="Data Source=localhost\sqlexpress;Initial Catalog=mydatabase;User Id=myuser;Password=mypassword;" /> 

+0

없음을이있다. 코드의 정적이 아닌 변형을 사용하면 효과가 입증됩니다. –

2

약간 아니라 정말 귀하의 질문에 대답하지만, ADO.NET 이미 연결 풀을 사용할 때 왜도록 SqlConnection에 대한 싱글을 사용하고 계십니까? 코드는 아주 잘처럼 보였다 수 : 프로그램에 대한 걱정

using (var conn = new SqlConnection(ConfigurationManager.ConnectionStrings["BAR"].ConnectionString)) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.Connection = conn; 
    cmd.CommandType = System.Data.CommandType.StoredProcedure; 
    cmd.CommandText = "SP_YOUR_PROC"; 
    cmd.ExecuteNonQuery(); 
} 

그리고 하나 더 적은 것 : 정적 필드가 을 언젠가 가 사용되기 전에 (하지 평가

+0

이것은 언어 이상한 질문이기 때문에 건축적인 것이 아닙니다. 입력에 감사드립니다. –

-1

연결 라이프 사이클을 결정 론적으로). 자세한 내용은 beforefieldinit을 참조하십시오. 따라서 시스템은 호출 될 때 SQL 연결을 만들 준비가되지 않았거나 이후에 정적 필드 을 제대로 만들 수도 있습니다.

또한 첫 번째 SQL 명령을 닫은 후에 두 번째 SQL 명령을 어떻게 처리합니까? SqlConnection의 작동 방식을 정확히 알지는 못하지만 닫은 후에 Dispose를 중단하고 연결을 삭제하면 static Foo.DBConn이 없어야합니다. 즉, 다시 평가되지 않습니다. 당신이 당신의 기본 인프라를 유지하려면

, 나는 GET에 대한 새로운도록 SqlConnection을 반환하는 정적 속성 정적 필드를 대체하지 않을 것이다 :

public static SqlConnection DBConn 
{ 
    get 
    { 
     return new SqlConnection(ConfigurationManager.ConnectionStrings["BAR"].ConnectionString); 
    } 
} 
+0

당신은 원래 게시물에서 "(이 예제는 일러스트레이션을 위해 한 번 사용하는 척합니다.)"부분을 놓쳤습니다. –

+0

@byte "정적 필드는 언젠가 전에 평가됩니다. 익숙한". –

+0

아니요. 나는 그 사실을 알아 냈습니다. 주소를 기재 한 귀하의 게시물의 구체적인 맥락보다는 오히려 요약에 대한 귀하의 게시물에 잘못 덧붙여 말한 것입니다. 계속해야 할 필요성이 있으면 언제든지 메시지를 보내주십시오. –