2015-01-13 1 views
4

Visual Studio 2008에서 C#을 사용하여 내 PC에서 MDF 파일을 반복하고 그 안에서 데이터를 추출합니다. 테이블 어댑터를 사용하여 로컬 MDF 파일을 가리 킵니다.SQL Server 사용자 인스턴스 오류 : 기존 데이터베이스가 허용 된 최대 수에 도달했습니다.

최근에 내 PC의 한 날이

System.Data.SqlClient.SqlException: Unable to create/attach any new database because the number of existing databases has reached the maximum number allowed: 32766

을 말하는 것처럼 내가 새로운 Windows 응용 프로그램을 시작하더라도 새로운 데이터 소스를 연결하고 여기에 (내 바탕 화면)을 MDF 파일을 추가 할 수 있도록 거부 데이터 소스로 위의 오류가 발생합니다.

아무도 기존 연결을 제거/삭제하는 방법을 알려 줄 수 있습니까?

내 코드가 다른 PC에서 제대로 작동하고 내 PC에 Visual Studio를 다시 설치했지만 여전히이 오류가 발생합니다.

C#을 표 어댑터 코드 : 오류가 SQL 서버에서 오는대로 VS는 도움이되지 않습니다 다시 설치

tmTableAdapter.Connection.ConnectionString = "Data Source=.\\SQLEXPRESS;AttachDbFilename='" + pathofmdffile + "';Integrated Security=True;Connect Timeout=30;User Instance=True"; 
tmTableAdapter.Connection.Open(); 
+3

'tmTableAdapter.Connection.Close()'를 할 수 있습니까? –

+1

SQL Server에서 오류가 발생하면 VS를 다시 설치해도 도움이되지 않습니다.SSMS에서 SQLEXPRESS 인스턴스에 연결하고 데이터베이스 폴더를 보면 32,766 개가 모두 보입니까? 당신은 아마도 그들을 분리해야합니다. –

+0

고마워, 그래, 나는 tmTableAdapter.Connection.Close() 세 줄을 C# 코드에서 나중에한다. SSMS를 열고 MYCOMPUTERNAME \ SQLEXPRESS 및 Look in Databases \ System Databases에 연결하면 4 DB (마스터, 모델, msdb 및 tempdb)가 표시됩니다 (사과, SQL Server에 익숙하지 않은 경우) – lway

답변

5

. 좋은 정보를 많이 가지고 이러한 MSDN 페이지에서

봐 :

는 "사용자 인스턴스"를 사용하고 있기 때문에를, 나는 DB를 추측 기본 SQLEXPRESS 인스턴스에 연결할 때 표시되지 않습니다.

확인 사항 : SSMS에서

  • , 다음을 수행하여 마지막 첨부 DB에 연결 :

    • 이동이 개체 탐색기하기를
    • 데이터베이스 엔진에
    • 새 연결
    • "서버에 연결"팝업 :
    • "옵션 >,311,772,743,925,862,473,210 "버튼을
    • 이동"추가 연결 속성 "탭
    • 하여 텍스트 영역에 다음 입력 :
      User Instance = true
    • 이 (가)를 클릭하십시오"데이터베이스 "폴더를"
    • 이 확장 버튼 "연결합니다. 당신은
    • 데이터베이스
    • 로 이동을 마우스 오른쪽 버튼으로 클릭 MDF 파일의 전체 경로로 명명, 그들 모두를 볼 수 "작업 >"
    • 첫 번째 옵션은 "분리"입니다

    분명히 이것은 32,766 개의 데이터베이스에 대해서는 실용적이지 않지만 몇 가지 경우에는 최선의 선택입니다.

  • 기본적으로 sqlservr.exe 프로세스가 약 60 분 동안 중단되며 종료하기 전에 첨부 한 데이터베이스가 목록에 추가되고 만료 카운터가 재설정됩니다. 가장 최근에 첨부 된 DB에 연결하여 프로세스를 즉시 종료 할 수 있습니다. 위에서 언급 한 단계는 새 쿼리에 대해 작동하거나 개체 탐색기를 통해 연결 한 다음 인스턴스 이름을 마우스 오른쪽 단추로 클릭하고 "새 쿼리"로 이동합니다.) 다음을 실행하십시오.

    SHUTDOWN; 
    

    이렇게하면 연결된 모든 데이터베이스가 한 번에 지워집니다.

  • 시간 초과를 60 분 미만으로 설정하십시오.

    -- View current setting (in the "run_value" field) 
    EXEC sp_configure 'user instance timeout' 
    -- Documentation says default is 60 but mine was 5 
    
    
    -- If you can't see the option, run the following: 
    EXEC sp_configure 'show advanced options', 1; 
    RECONFIGURE; 
    
    
    -- To change it, run the following: 
    EXEC sp_configure 'user instance timeout', 5; 
    
  • 은 "SQL Server Express의 유틸리티를 사용하여 : (당신이 부모 인스턴스에 연결되어 있는지 확인)

    A system administrator on the parent instance can set the duration of the time-out period for a user instance by using sp_configure to change the user instance timeout option. The default is 60 minutes.

    SSMS에서 다음 SQL Server Express User Instances 페이지 (위와 같은 링크)에 따르면, "하나 이상의 데이터베이스를 분리하려면 다음을 수행하십시오.

  • 봐 :

  • 다운로드에서 (현재 버전은 v1.0.2130입니다) 이후

    • XP/Vista : C : \ Documents and Settings {사용자 이름} \ Loc 알 설정 \ 응용 프로그램 데이터 \ 마이크로 소프트 \ Microsoft SQL Server를 데이터 \ SQLEXPRESS Windows 7 및 최신에

    • : C : \ 사용자 {사용자 이름} \의 AppData \ 로컬 \ 마이크로 소프트 \ Microsoft SQL Server를 데이터 \ SQLEXPRESS

    SQL Server 프로세스가 실행되는 동안에는 이러한 파일을 삭제할 수 없으므로 대부분 정보 용입니다.

    : 온 것 당신은 각 DB를 사용하여 수행하는 경우 sp_detach_db을 실행하여 루프에서 많은 DB에 부착 될 경우, 당신은 프로그래밍 방식으로 그 과정에서 그들을 제거 할 수 있습니다, 근거를 들어

USE [master]; 
ALTER DATABASE [{DatabaseName}] SET SINGLE_USER WITH ROLLBACK IMMEDIATE; 
EXEC sp_detach_db @dbname =N'{DatabaseName}'; 

그냥 참고로는 "사용자 인스턴스는"지금은 사용되지 않습니다. SQL Server Express LocalDB을 사용하여 조사해야합니다.

+2

도움을 주셔서 대단히 감사합니다. 더 많은 것을 배우고, 환상적인 대답을 얻을 수있는 링크가있는 명확하고 간결한 대답 (나와 같은 학습자를위한). 한 번에 모든 연결을 종료 할 때 약간 확장 할 수 있습니까? 위와 같이 개별적으로 분리 할 수 ​​있지만 가능한 경우 여러 데이터베이스를 선택하고 분리하려고합니다 (모든 32k dbs에 대해 실용적이지는 않다) – lway

+0

Nevermind는 "SQL Server Express 유틸리티"솔루션을 발견했습니다. 다음 링크를 참조하십시오. http://stackoverflow.com/questions/2367688/how-do-you-stop-a-user-instance-of-sql-server-sql-express-user-instance-databa – lway

+1

@lway 예, 이 유틸리티는 두 번째 링크 인 "SQL Server 2005 Express Edition 사용자 인스턴스"에 언급되어 있지만 와일드 카드로 여러 분리를 수행 할 수 있음을 나타내지는 않습니다. 좋은. 나는 그것을 내 대답에 추가 할 수있다. 그러나 그것은 포격을 요구하기 때문에 프로그래밍 방식으로 수행하는 것은 아직 좋은 선택이 아닙니다. 대신 각 프로세스마다 그것을하고 싶지 않으면'sp_detach_db'를 루프에서 실행해야합니다. 결국 SSEUtil이하는 일입니다. 단일 사용자 모드를 보장하면됩니다. 그리고 실제 DB가 아닌 사용자 인스턴스 만 보여주는 DMV가 있습니다. 나는 갱신 할 것이다. –

관련 문제