2012-04-14 4 views
1

사용자 지정 작업을 사용하여 Visual Studio 2010 웹 설치 프로젝트에서 새 데이터베이스를 만들려고합니다. 먼저 사용자가 자신의 SQL Server 이름과 인증 모드를 선택합니다. 다음을 사용하여 서버 이름을 얻습니다.MVC SMOLite를 사용하여 SQL 데이터베이스를 만듭니다.

public string ServerString { get; set; } 
    private void SetServerString() 
     { 
      string cs; 
      if (cbInstant.SelectedIndex == 0) // windows authentication 
       cs = cbServer.SelectedValue.ToString(); 
      else 
       cs = string.Format(cbServer.SelectedValue + ";" + txtUser.Text + ";" + txtPassword.Text); 

      ServerString = cs; 
     } 

     private void btnNext_Click(object sender, EventArgs e) 
     { 
       SetServerString(); 
       formContext.Parameters["ServerString"] = this.ServerString; 
       this.Close(); 
     } 

잘 작동하고 예를 들어 "PCName \ SQLEXPRESS"를 얻습니다. 사용자 지정 작업에

:

public override void Install(System.Collections.IDictionary stateSaver) 
     { 
    string serverString = ""; 
      if (this.Context.Parameters["ServerString"] != null) 
       serverString = this.Context.Parameters["ServerString"]; 
base.Install(stateSaver); 
      MakeSQLDatabase(connectionString); 
} 
    private void MakeSQLDatabase(string serverString) 
     { 
      FileInfo file = new FileInfo("M:\\script.sql"); 
      string script = file.OpenText().ReadToEnd(); 
      file.OpenText().Close(); 
      SqlConnection sqlConnection = new SqlConnection(); 
      SqlConnectionStringBuilder sqlConnectionStringBuilder = new SqlConnectionStringBuilder(); 
      sqlConnection.ConnectionString = sqlConnectionStringBuilder.ToString(); 
      Server server = new Server(sqlConnection); 
      server.ConnectionContext.ServerInstance = (serverString); 
      server.ConnectionContext.Connect(); 
      if (server.Databases["databasename"] != null) 
      { 
       server.KillAllProcesses("databasename"); 
       server.KillDatabase("databasename"); 
      } 
      Database database = new Database(server, "databasename"); 
      database.Create(); 
      database.ExecuteNonQuery(script); 
     } 

은 내가

@"PCName\SQLEXPRESS" 
작동

에 변수 serverString을 변경하지만 경우, 오류 "서버를 찾을 수 없거나 accessiable되지 않았다"를 얻을! 나는 문제가 무엇인지 알 수 없다. 버전 2와 버전 4 사이에 충돌해도 나는 당신의 도움을 부탁드립니다

<?xml version="1.0"?> 
<configuration> 
    <startup useLegacyV2RuntimeActivationPolicy="true"> 
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/> 
    </startup> 
</configuration> 

app.confg

를 추가로 있기 때문에 나는 Microsoft.SqlServer.Management.Smo를 사용하지 수, 또는 당신은 저를 안내 할 수 있습니다 이 작업을 수행하기위한 더 나은 솔루션. 미리 감사드립니다.

답변

1

나는 그것을 얻지 못한다. .NET 4 대신 .NET 2로 새로운 데이터베이스를 만들고 싶습니까? 나는 그것을 위해 SMO를 사용했지만 역시 시도 할 것이다. :) Atm 나는 master 데이터베이스를 "CREATE DATABASE"라는 작업을 사용하여 SQL에 연결한다. 이는 "마스터"데이터베이스에 유효한 연결이있는 한 계속 작동합니다.

UPDATE :

var sql = ""; 
using (var cnn = new SqlConnection(connection)) 
{ 
    cnn.Open(); 
    sql = "CREATE DATABSE <databasename>"; 
    using (var cmd = new SqlCommand(sql, cnn)) 
    { 
    try 
    { 
     cmd.CommandTimeout = 120; 
     cmd.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex); 
    } 
    } 
    sql = "USE DATABSE <databasename>;EXEC sp_dbchangeowner <Username>"; 
    using (var cmd = new SqlCommand(sql, cnn)) 
    { 
    try 
    { 
     cmd.CommandTimeout = 120; 
     cmd.ExecuteNonQuery(); 
    } 
    catch (Exception ex) 
    { 
     Console.WriteLine("Execution error!\n\n" + sql + "\n\n\n" + ex); 
    } 
    } 
    cnn.Close(); 
} 

연결은 "마스터"데이터베이스에 연결되어야합니다. 이며 교체해야합니다. 당신 같은이 다음 동적 뭔가하고 싶은 경우 데이터베이스 이름 "마스터"를 사용하여, 당신은 이미 당신의 기능을 설정

sql = string.Format("USE DATABSE {0};EXEC sp_dbchangeowner {1}",database,username); 

연결합니다. 그런 다음 모든 DB를 이와 같이 설정할 수 있습니다. 이 도움이

IF ((SELECT IsNull(db_id('latest'),-1))>0) 

희망 :

은 첫 번째 SQL a를 추가 할 수있는 SQL의 지원을 확인하십시오. 나는 이것이 가장 현명한 방법인지는 모르겠지만,이 경우 나는 내가 원하는 모든 것을 연결하고, 만들고, 변경하는 등의 작업을 간단하게 할 수 있습니다. 제 경우에는 전적으로 데이터베이스를 만들고, stringbuilder로 여러 SQL 명령을로드하고 새 데이터베이스에 대해 모든 CREATE 테이블/열/쿼리 문을 실행합니다. DB 삭제는 간단한 "DROP DATABASE"입니다.

+0

이것은 4.0 응용 프로그램을 설치하는 웹 설치 응용 프로그램입니다. SMO 또는 SMOLite를 사용하려면 두 가지 선택이있었습니다. 어떻게하면 서버에 연결하고 데이터베이스를 만들었는지 나와 공유 할 수 있다면 고맙겠습니다. 감사합니다 – hncl

+0

@ user373721 내가하는 방식을 명확하게하기 위해 내 게시물을 업데이 트 – YvesR

+0

샘플의 첫 번째 줄은 SQL 0 ""; 오류가 발생했습니다. 이것은 분명히 성명서가 아닙니다. 감사합니다 – hncl

관련 문제