2016-07-01 3 views
0

root SQL Server에서 로그인을 기반으로 데이터베이스에 사용자를 만들려고하지만 구문 오류가 계속 발생합니다. SqlCommand에 SSMS의 실제 T-SQL과 다른 유형의 구문이 필요하지 않으면이 간단한 쿼리에서 문제가 발생하지 않습니다.GO (로그인 기반 사용자 생성) 근처의 구문이 올바르지 않습니다.

var cmd = new SqlCommand("USE " + databaseName + " GO CREATE USER [" + txtUser.Text + "] FOR LOGIN [" 
       + txtUser.Text + "] GO", conn); 

내 연결 문자열 내가 그것을 통과하고 있지 않다이

private string GetConnectionString(string initialCatalog = "") 
    { 
     return "Data Source=" + txtInstance.Text.Trim() + ";User ID=" + txtUser.Text.Trim() + 
      ";" + (initialCatalog != "" ? "Initial Catalog=" + initialCatalog : "") 
      + "Password=" + txtPass.Text.Trim() + ";Network Library=dbmssocn;"; 
    } 

처럼 보이는 내가 실제 명령 텍스트에서 USE 문을 제거하고 대신에 DBNAME을 통과하려고 않았다 initialCatalog

GetConnectionString 메서드를 사용하여 초기 카탈로그로 설정했지만 사용자가 로그인에 실패했습니다.

사용자가 주어진 데이터베이스에 없기 때문에 이것이라고 가정합니다. 사용자 x이 FULL 권한을 가진 sql 서버의 로그인이라는 사실을 감안할 때, 전체 권한으로이 로그인에 연결된 SQL 서버 내의 데이터베이스에 사용자를 만들려면 어떻게해야합니까?

수정
나는 내 코드가 삽입 공격에 취약하다는 것을 알고 있습니다. 그러나, 이것은 내가 사용할 가능성이 가장 큰 내부 도우미 응용 프로그램입니다.

+0

을 실행합니다. 나는 앤디의 대답을 사용하는 것을 끝내었다. 하나의'ExecuteNonQuery'에서 모든 것을 얻을 수 있기를 희망했지만이 작은 응용 프로그램에 대해서는 중요하지 않습니다. – Adrian

+0

'GO'는 SQL Management Studio의 기능으로 tsql의 일부가 아닙니다. 수동으로 배치로 수동으로 분리해야합니다. 당신은 별도의'SqlCommand' 객체를 가질 필요가 없습니다. 동일한 객체를 다시 사용할 수 있습니다.'cmd.CommandText' 속성을 업데이트 한 다음'ExecuteNonQuery'를 호출하십시오. –

+1

또한 ['SqlConnectionStringBuilder'] (https : // msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnectionstringbuilder(v=vs.110).aspx) 문자열 연결을 만드는 것보다 연결 문자열을 만드는 것이 더 신뢰할 수 있습니다. –

답변

0

더 나은 당신은 모두 쿼리 작동하지 않았다 별도로

var cmd = new SqlCommand("USE " + databaseName , conn); 
cmd.ExecuteNonQuery(); 

cmd = new SqlCommand("CREATE USER [" + txtUser.Text + "] FOR LOGIN [" 
      + txtUser.Text + "]", conn); 
cmd.ExecuteNonQuery(); 
+0

새 명령을 만들 필요가 없으며 단지'CommandText' 속성을 업데이트하십시오. –

+0

맞음 !!! – andy

+0

@ScottChamberlain 그것이 내가 한 일입니다 :) – Adrian

관련 문제