ドメイン管理者アカウントで動作する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ステータスを変更できません。次のように我々が得るエラーは以下のとおりです。
は私のコード(私は、接続文字列でサーバー名をIPアドレスに変換していますので注意です。たとえば、:。MYSQLSERVER2K8 \ VAULTは111.111.111.111 \ VAULTに変換されます:SQL:データベース 'My_Test_DataBase' は存在しません:---> System.Data.SqlClient.SqlExceptionはROLLBACK IMMEDIATEを使用して、データベースMy_Test_DataBase SET SINGLE_USERを変更します。 sysdatabasesを確認してください。 ALTER DATABASE文が失敗しました。 System.Data.SqlClient.SqlConnectionにあります。ここで
#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
なぜ私はそれをipに変換していますか?私の瞬時に反応はあなたの問題だった.... –
それは問題であろうか?だからweb.config、connectionString = "データソース= \ VAULT; ..."、それはそれを引き起こすでしょうか?なぜなら、私がdev/testing環境でこれを実行すると、connectionString = "data source = ; ..."; –
user1100221
私たちがIPアドレスに変換するのは、どんな理由であれ、私たちのdev/testサーバーはどんなサーバー名(例:MYSQLSERVER2K8)でもDNSルックアップを実行できないからです。 IPアドレスを指定すると動作します。私はIPアドレスに変換しないで試して、それが動作するかどうかを確認します。うまくいえば、DNSルックアップの問題はそのサーバー上で修正されています。 – user1100221