Я создаю базу данных, используя Объекты управления SQL Server .
Я написал следующий метод для создания базы данных:
public static void CreateClientDatabase(string serverName, string databaseName)
{
using (var connection = new SqlConnection(GetClientSqlConnectionString(serverName, String.Empty)))
{
var server = new Server(new ServerConnection(connection));
var clientDatabase = new Database(server, databaseName);
clientDatabase.Create();
server.ConnectionContext.Disconnect();
}
}
Вскоре после этого явызовите другой метод для выполнения сценария SQL для генерации таблиц и т. д .:логин.Ошибка входаНе удалось войти в систему для пользователя 'user'.
Если я попытаюсь пройтись по инструкциям в отладчике, это исключение никогда не произойдет, и скрипт выполнится нормально.
Мое единственное предположение, что серверу требуется некоторое время для инициализации базы данных, прежде чем ее можно будет открыть.Это точно?Есть ли способ определить, готова ли база данных, кроме попыток и неудачных попыток подключения?
Редактировать: Следует отметить, что база данных определенно создается во всех случаях.
Редактировать 2: Перед созданием базы данных я вызываю System.Data.Entity.Database.Exists метод EntityFramework.dll, чтобы проверить, существует ли база данных.Если я удаляю этот вызов, все, кажется, работает как ожидалось.Это похоже на то, что этот вызов кэширует результат и портит последующие соединения от просмотра новой базы данных (независимо от того, используют ли они Entity Framework или нет).
Редактировать 3: Я заменил метод EntityFramework Database.Exists
на SMO-подход, используя Server.Databases.Contains(databaseName)
.Я получаю ту же проблему в том, что база данных не может быть открыта сразу после создания.Опять же, если я не проверю, существует ли база данных до ее создания, я могу сразу же открыть ее после ее создания, но я бы хотел иметь возможность проверить ее существование до ее создания, поэтому я не пытаюсь создать существующую базу данных.
И EntityFramework Database.Exists
, и SMO Server.Databases.Contains
оба просто выполняют SQL, который ищет имя базы данных в master.sys.databases.Я не понимаю, почему / как это мешает соединениям с базой данных.