2014-03-07 2 views
0

저는 C#으로 Windows 서비스를 만들고 있는데, 작동한다면 웹 응용 프로그램에서 동일한 메소드를 사용할 수도 있습니다. 주 서비스는 ConfigurationManager를 사용하여 app.config에서 검색된 sqlconnection을 사용하며 여러 태스크를 실행하기 위해 여러 유형의 스레드를 작성합니다. 이 스레드 각각은 고유 한 연결을 가지고 있습니다 (클래스 속성에 저장 됨).은 public static sql connection secure입니다.

public partial class MainService : ServiceBase{ 
    private static string SQLConnStr; 
    protected static SqlConnection SQLConn; 
} 

class OtherClass{ 
    private sqlconnection sqlconn; 
    private string connstr; 

} 

내가 함께 붙어 부분은, 내가 다른 개체 유형을 만들 때, 나는 OtherClass '연결을 사용하여 DB에 액세스 할 수 해당 개체를 필요로한다는 것이다. 이 새 오브젝트는 나중에 처리하기 위해 OtherClass에서 작성되고 호출됩니다.

OtherClass에서 SQL 연결을 다시 사용할 수 있습니까? sql 연결 문자열을 public static으로 설정하는 것이 안전하고 안전합니까? 내가 사용하고있는 디자인이 좋지 않은가요?

+1

가장 좋은 방법은 연결 문자열을 Web.config 파일에 저장하는 것입니다. –

+1

원하는 대답은 상황에 따라 다릅니다. 클래스 라이브러리라면 모든 것이 DLL로 컴파일됩니다. 이 경우 해당 DLL을 사용하는 누군가가 (공용 인 경우) 연결 문자열에 액세스 할 수있게됩니다. 이것은 안전하지 않다고 생각합니다. –

+0

u는 dll에 클래스를 넣으면 private인지 public인지 상관 없습니다. – cSharpDev

답변

-1

나는 당신의 대답을 좋아하지만, 나는 잠시 들여다 본 후에 나쁜 디자인의 경우이다. 그래서 MainService의 공용 정적 쿼리 함수를 만들하기로 결정

public static void qQuery(string querystr){ 
    using(sqlconnection conn = new sqlconnection(sqlconnstr){ 
     ..... 
    } 
} 

sqlconnstr는 서비스가 시작될 때 초기화 MainService에서 개인 문자열입니다.

안전하고 안전한 방법이라고 생각합니다.

2

OtherClass 생성자로 전달 하시겠습니까? 예를와

세부 정보 :

public partial class MainService : ServiceBase{ 
    private string SQLConnStr; 
} 

class OtherClass{ 
    private string connstr; 
    public OtherClass(string _connstr) { this.connstr = _connstr; } 
    public foo() { using(var conn = new SqlConnection(connstr) { ... } } 
} 

는 연결 풀 있기 때문에 때마다 .NET에서 괜찮 new SqlConnection 만들기.

+0

최후의 수단이 될 것입니다. 나는 그렇게하는 것을 싫어한다. – cSharpDev

+0

@cSharpDev 그럼 메인 행을 호출하면 행운을 빕니다 – Cynede

+0

@Heather : 같은 질문에 답한 다른 사람들은 어때요? 이상한 사람 같아 보이지 않습니까? 당신의 대답 아래에 당신의 주장에 근거한 것 같습니다. 나는 더 많은 사람들이 그것이 맞는 대답으로 생각하는 방식이 다르다는 것을 이해할 것을 기대합니다. 당신은 'OtherClass 생성자에게 전달 했습니까?'라고 물었습니다. 이제는 질문이나 대답이 제 3 자에게 혼란스러워 보입니다. –

1

각 구성 메커니즘을 사용해야합니다. 응용 프로그램/Windows 서비스의 경우이 파일은 app.config 파일이고 웹 응용 프로그램의 경우 파일은 web.config이고 DLL의 경우이 설정은 여러 번 여기에 설명 된대로 DLL app.config에서 응용 프로그램의 app.config/web.config으로 복사해야합니다 (DLL은 해당 파일을 읽지 않습니다. 설정 파일이므로 설정을 응용 프로그램의 config 파일로 가져와야합니다.

Visual Studio의 설정 디자이너를 사용하여 새로운 연결 문자열 설정을 간단하게 추가 할 수 있습니다. 필요한 경우 다른 프로젝트에도 추가하십시오.

동일한 프로젝트 내에서 클래스의 연결 문자열을 사용하려면 MyConnectionString이라는 설정으로 가정하면 Settings.Default.MyConnectionString을 사용하면됩니다.

DLL에 대한 또 다른 예외 : 일부 DLL은 자체 설정이 필요하지 않지만 데이터베이스에 액세스해야합니다. 이 경우 데이터베이스 액세스가 필요한 함수에 연결 문자열 또는 SqlConnection을 전달할 수 있습니다.

+0

알아. 내가 한 것은 표준 설정 메커니즘에 의존 한 다음 코드 전체에서 해당 설정을 사용하거나 DLL에 전달하는 것입니다. 나는 그 질문을 읽었다. 너도 알지? :디 –

1

연결 * 문자열 *과 연결 자체는 구분됩니다. connectionstring (연결해야 할 위치를 설명)에 대해서는 config 파일에 저장할 수 있으므로 쉽게 변경할 수 있습니다.

데이터베이스와 통신하는 데 사용되는 연결 자체는 열고 닫아야합니다. 데이터 보관함을 사용할 때, 일반적으로 동시 명령에 대해 동일한 연결을 사용할 수 없습니다. 가능한 한 늦게 새 연결을 열고 닫는 것이 가장 좋습니다. 내장 된 연결 풀링을 통해 실제 연결을 최적화하는 것이 좋습니다.

관련 문제