2010-05-13 2 views
2

런타임에 SQL Server Express 2008을 만드는 코드를 가지고 데이터베이스에 연결하려고 시도합니다 Transact-SQL의 초기화 스크립트 데이터베이스를 작성하는 코드는 다음과 같습니다.C# 코드로 SQL Express 2008 데이터베이스를 만들지 만 sysadmin과 연결하려고하면 로그인에 실패 함

private void CreateDatabase() 
    { 
     using (var connection = new SqlConnection(
      "Data Source=.\\sqlexpress;Initial Catalog=master;" + 
      "Integrated Security=true;User Instance=True;")) 
     { 
      connection.Open(); 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = 
       "CREATE DATABASE " + m_databaseFilename + 
       " ON PRIMARY (NAME=" + m_databaseFilename + 
       ", FILENAME='" + this.m_basePath + m_databaseFilename + ".mdf')"; 
       command.ExecuteNonQuery(); 
      } 
     } 


    } 

데이터베이스가 성공적으로 작성되었습니다. 그 후, 나는 다음과 같은 코드를 사용하여 초기화 스크립트를 실행하기 위해 데이터베이스에 연결을 시도 : 그러나

private void ExecuteQueryFromFile(string filename) 
    { 
     string queryContent = File.ReadAllText(m_filePath + filename); 
     this.m_connectionString = string.Format(
      @"Server=.\SQLExpress; Integrated Security=true;Initial Catalog={0};", m_databaseFilename); 
     using (var connection = new SqlConnection(m_connectionString)) 
     { 
      connection.Open(); 
      using (var command = connection.CreateCommand()) 
      { 
       command.CommandText = queryContent; 
       command.CommandTimeout = 0; 
       command.ExecuteNonQuery(); 
      } 
     } 
    } 

을의 connection.Open() 문은 다음과 같은 예외 던지기, 실패

데이터베이스에서 "TestData" 을 열 수 없습니다. 로그인 이 (가) 실패했습니다. 사용자 'MYDOMAIN \ myusername'에 대한 로그인에 실패했습니다.

연결하려는 계정에 sysadmin 권한이있어이 데이터베이스에 연결할 수 있어야합니다 (master 데이터베이스 연결을 사용하여 데이터베이스를 만들 수 있음). 첫 번째 장소).

답변

4

사용자가 지정한 이유가 있나요 사용자 인스턴스 = 당신이 그것을 만들 수 있지만 당신이 그것을 연결을 시도하지 않을 때 때 진정한?

사용자 인스턴스로 연결 한 후에 만들면 데이터베이스 파일이 만들어 지지만 실제 인스턴스에는 연결되지 않습니다. 첫 번째 연결 문자열에 User Instance = True를 지정하거나 두 번째 연결 문자열에 추가하고 사용할 데이터베이스 파일을 지정해야합니다.

+0

당신이 옳습니다.차이점을 알지 못했습니다. 두 연결에서 User Instance = true를 적용하면 작동합니다. 고맙습니다! – andragon

0

로깅중인 사용자가 'TestData'데이터베이스에 대한 권한을 갖고 있습니까?

사용자에게 필요한 권한을 부여하지 않는 경우.

나는

.\\sqlexpress 

두 번째는

.\SQLExpress 
+0

두 번째 문자는 리터럴 문자열이고 첫 번째 문자는 \\ 차이점을 설명하지 않습니다. –

+0

로그인하는 사용자는 sysadmin입니다 ... 자동으로 권한이 있어야합니까? 아니요? 또한 데이터베이스를 처음 만들 때 사용하는 계정이기도합니다. 연결 문자열에 대해 첫 번째 문자는 \\는 C#에서 이스케이프 문자이므로 \\를 두 번 사용합니다. 두 번째 이유는 그 문자열 때문에 "@"를 사용하기 때문에 문자열을 이스케이프 할 필요가 없습니다. \ – andragon

0

당신은 사용자를 만들 발행해야합니다 서버에 연결을 만들 처음 당신이 무엇을 의미 확실하지만,에 아닙니다 명령 (참조 : http://msdn.microsoft.com/en-us/library/ms173463.aspx 참조)은 데이터베이스를 만든 후 해당 데이터베이스에 대한 연결을 열기 전에 수행해야합니다. 예를 들어

:

CREATE USER 'MYDOMAIN\myusername' FOR LOGIN 'MYDOMAIN\myusername' 
+0

문제는 CREATE USER 문을 대상 데이터베이스에서 실행해야한다는 것입니다. 설명서에 CREATE USER '사용자를 현재 데이터베이스에 추가합니다.'). 저는 성명을 실행하기 위해 먼저 데이터베이스에 연결해야합니다. 정확히 내가 할 수없는 것입니다 ... 아니면 내가 잘못하고있는 것입니까? – andragon