2012-02-10 5 views
1

ドメイン管理者アカウントで動作するC#で書かれたサービスがあります。このアカウントは、そのドメイン内のすべてのSQL Server上でSQL adminとして設定されています。サービスは、あるサーバーから別のサーバーにmdf/ldf(SQLサーバー2003または2008)をコピーし、新しいサーバーに接続する必要があります。ソースサーバーでDBを切り離す代わりに、DBの状態を読み取り専用に変更してから、mdf/ldfファイルをコピーしています。それらがコピーされると、私はDBステータスを読み書き可能にリセットします。接続文字列にインスタンス名がある場合のALTER DBエラー - C#4.0

ソースサーバ名がMYSQLSERVER2K8のようなものである場合、これが働いています。ただし、インスタンス名の場合はコードが機能しません。例:MYSQLSERVER2K8 \ VAULT。私は自分のコードでNUnitで単体テストを実行しており、単体テストは両方のケースに合格しています。ただし、サービスはDBステータスを変更できません。次のように我々が得るエラーは以下のとおりです。

SQL:データベース 'My_Test_DataBase' は存在しません:---> System.Data.SqlClient.SqlExceptionはROLLBACK IMMEDIATEを使用して、データベースMy_Test_DataBase SET SINGLE_USERを変更します。 sysdatabasesを確認してください。 ALTER DATABASE文が失敗しました。 System.Data.SqlClient.SqlConnectionにあります。ここで

は私のコード(私は、接続文字列でサーバー名をIPアドレスに変換していますので注意です。たとえば、:。MYSQLSERVER2K8 \ VAULTは111.111.111.111 \ VAULTに変換されます:

#region ChangeDatabaseStatus 
    /// <summary> 
    /// Change the database status to read-only/read-write 
    /// </summary> 
    /// <param name="serverName"></param> 
    /// <param name="databaseName"></param> 
    /// <param name="status"></param> 
    public virtual bool ChangeDatabaseStatus(string serverName, string databaseName, string status) 
    { 
     DateTime beginTimeStamp = DateTime.Now; 
     string sql = String.Empty; 
     bool databaseStatusChanged = false; 

     try 
     { 
      SqlConnection connection = GetSqlConnection(false); 

      string connectionString = connection.ConnectionString; 
      string serverIPAddress = Dns.GetHostAddresses(serverName.Contains(@"\") ? serverName.Substring(0, serverName.IndexOf(@"\")) : serverName)[0].ToString(); 
      connectionString = connectionString.Replace("{0}", serverIPAddress = serverName.Contains(@"\") ? serverIPAddress + serverName.Substring(serverName.IndexOf(@"\"), serverName.Length - serverName.IndexOf(@"\")) : serverIPAddress); 

      connection.Close(); 
      connection = new SqlConnection(connectionString);     

      using (SqlCommand command = new SqlCommand()) 
      { 
       command.Connection = connection; 
       command.CommandTimeout = _commandTimeout; 
       command.CommandType = CommandType.Text; 

       command.CommandText = String.Format("ALTER DATABASE {0} SET SINGLE_USER WITH ROLLBACK IMMEDIATE", databaseName); 

       //Debugging & Exception handling 
       sql = HelperFunctions.BuildSQL(command); 

       connection.Open(); 

       command.ExecuteNonQuery(); 

       connection.Close(); 
      } 

      using (SqlCommand command = new SqlCommand()) 
      { 
       command.Connection = connection; 
       command.CommandTimeout = _commandTimeout; 
       command.CommandType = CommandType.Text; 

       command.CommandText = status == "ReadOnly" ? String.Format("ALTER DATABASE {0} SET READ_ONLY", databaseName) : String.Format("ALTER DATABASE {0} SET READ_WRITE", databaseName); 

       //Debugging & Exception handling 
       sql = HelperFunctions.BuildSQL(command); 

       connection.Open(); 

       command.ExecuteNonQuery(); 

       connection.Close(); 

       databaseStatusChanged = true; 
      } 

      using (SqlCommand command = new SqlCommand()) 
      { 
       command.Connection = connection; 
       command.CommandTimeout = _commandTimeout; 
       command.CommandType = CommandType.Text; 

       command.CommandText = String.Format("ALTER DATABASE {0} SET MULTI_USER", databaseName); 

       //Debugging & Exception handling 
       sql = HelperFunctions.BuildSQL(command); 

       connection.Open(); 

       command.ExecuteNonQuery(); 

       connection.Close(); 
      } 

     } 
     catch (Exception e) 
     { 
      throw new DataProviderException(String.Format("{0} operation failed. SQL: {1}", MethodBase.GetCurrentMethod().Name, sql), e); 
     } 
     finally 
     { 

      LogPerformance(String.Format("Elapsed time for: {0}", MethodBase.GetCurrentMethod().Name), beginTimeStamp, DateTime.Now, null); 
     } 

     return databaseStatusChanged; 
    } 
    #endregion //ChangeDatabaseStatus 
+1

なぜ私はそれをipに変換していますか?私の瞬時に反応はあなたの問題だった.... –

+0

それは問題であろうか?だからweb.config、connectionString = "データソース= \ VAULT; ..."、それはそれを引き起こすでしょうか?なぜなら、私がdev/testing環境でこれを実行すると、connectionString = "data source = ; ..."; – user1100221

+0

私たちがIPアドレスに変換するのは、どんな理由であれ、私たちのdev/testサーバーはどんなサーバー名(例:MYSQLSERVER2K8)でもDNSルックアップを実行できないからです。 IPアドレスを指定すると動作します。私はIPアドレスに変換しないで試して、それが動作するかどうかを確認します。うまくいえば、DNSルックアップの問題はそのサーバー上で修正されています。 – user1100221

答えて

0

エイリアスが設定されていないか確認してください。

ロードでは、SQL Server構成マネージャは、ネイティブクライアントの下で、その後、エイリアス。

トニー・ホプキンソンが言うように、テストをあなたがSQLCMDまたはSを使用して接続することができます同じマシンからのもの:

sqlcmd -S MYSQLSERVER2K8\VAULT -q "ALTER DATABASE dbname SET SINGLE_USER WITH ROLLBACK IMMEDIATE" 
関連する問題