Методы DatabaseExists(), CreateDatabase() и DeleteDatabase()

88

»» В ДАННОЙ СТАТЬЕ ИСПОЛЬЗУЕТСЯ ИСХОДНЫЙ КОД ДЛЯ ПРИМЕРОВ

DatabaseExists()

Метод DatabaseExists может использоваться для определения существования базы данных. Определение существования базы данных основано на строке соединения, указанной при создании экземпляра DataContext. Если задается путь к файлу .mdf, метод ищет базу данных в пути с указанным именем. Если же задается сервер, метод проверит сервер.

Метод DatabaseExists часто применяется в сочетании с методами DeleteDatabase и CreateDatabase.

Метод DatabaseExists имеет один прототип, описанный ниже:

bool DatabaseExists()

Этот метод вернет true, если база данных, указанная в строке соединения, существует при создании экземпляра DataContext. В противном случае он вернет false.

К счастью, этот метод продемонстрировать очень просто. В следующем коде просто создается экземпляр DataContext и вызывается метод DatabaseExists, чтобы посмотреть, существует ли база данных Northwind. И, конечно же, известно, что эта база существует:

// Используйте свое подключение
            Northwind db = new Northwind(@"Data Source=MICROSOF-1EA29E\SQLEXPRESS;
                       Initial Catalog=C:\NORTHWIND.MDF;
                       Integrated Security=True");

            Console.WriteLine("\n  База данных 'Northwind' {0}",
                db.DatabaseExists() ? "существует" : "не существует");

Вот результат:

Пример вызова метода DatabaseExists

CreateDatabase()

Поскольку сущностные классы знают настолько много о структуре базы данных, на которую они отображаются, был предоставлен метод CreateDatabase, предназначенный для создания базы данных.

Однако следует осознавать, что он может создавать только те части базы данных, о которых ему известно через сущностные классы или файл отображения. Поэтому содержимое таких вещей, как хранимые процедуры, триггеры, определенные пользователем функции и ограничения, не будет включено в базу данных, создаваемую подобным способом, поскольку нет атрибутов, задающих эту информацию. Тем не менее, для простого приложения это может оказаться вполне приемлемым.

В отличие от большинства прочих изменений, которые вносятся в базу данных через DataContext, метод CreateDatabase выполняется немедленно. Нет необходимости вызывать метод SubmitChanges, и выполнение не является отложенным. Это предоставляет преимущество в виде возможности создать базу данных и начать вставлять в нее данные немедленно.

Метод CreateDatabase имеет один прототип, описанный ниже:

void CreateDatabase()

Этот метод не принимает аргументов и ничего не возвращает.

Применение этого метода продемонстрировать просто, и нижеследующий код доказывает это:

Northwind db = new Northwind(@"C:\NORTHWND.MDF");

            db.CreateDatabase();

В этом примере намеренно записано имя файла NORTHWND.MDF без буквы i, чтобы это не затронуло базу Northwind, если она установлена.

И этот код не производит никакого экранного вывода, так что нет результатов, которые стоило бы показать. Однако если заглянуть в каталог С:\, там можно увидеть файлы Northwnd.mdf и Northwnd.ldf. Кроме того, в окне SQL Server Management Studio можно увидеть присоединенный файл C:\Northwnd.mdf.

Этот метод лучше всего сочетать с методом DatabaseExists. Если попытаться вызвать метод CreateDatabase, когда база данных уже существует, будет сгенерировано исключение. Чтобы продемонстрировать сказанное, просто запустите код второй раз, не удаляя или не отключая файл C:\Northwnd.mdf с помощью SQL Server Management Studio или Enterprise Manager. Получится следующий вывод:

Unhandled Exception: System.Data.SqlClient.SqlException: 
Database 'C:\Northwnd.mdf' already exists. Choose a different database name.

Необработанное исключение: System.Data.SqlClient.SqlException: 
База данных 'C:\ Northwnd.mdf' уже существует. 
Выберите другое имя для базы данных.

Кроме того, не допускайте ошибку, предполагая, что можно просто удалить два созданных файла базы данных Northwind из файловой системы, чтобы избавиться от базы данных и получить возможность запустить пример снова. SQL Server по-прежнему будет содержать их в своем каталоге. Чтобы второй запуск метода CreateDatabase удался, необходимо в правильном порядке отсоединить и удалить базу данных.

Можно удалить или отключить вновь созданную базу данных, чтобы предотвратить путаницу в будущем, или же просто оставить ее на месте для того, чтобы ее удалил следующий пример.

DeleteDatabase()

LINQ to SQL предоставляет возможность удаления базы данных с помощью метода DeleteDatabase объекта DataContext. Попытка удалить базу данных, которая не существует, приведет к генерации исключения, так что этот метод лучше вызывать после проверки существования базы данных с помощью метода DatabaseExists.

В отличие от большинства других изменений, которые вносятся в базу данных через DataContext, метод DeleteDatabase выполняется немедленно. Нет необходимости вызывать SubmitChanges, и выполнение не является отложенным.

Метод DeleteDatabase имеет единственный прототип, описанный ниже:

void DeleteDatabase()

Этот метод не принимает аргументов и ничего не возвращает.

В следующем коде удаляется база данных, которая была создана в предыдущем коде:

Northwind db = new Northwind(@"C:\NORTHWND.MDF");
db.DeleteDatabase();

Этот пример не создает никакого экранного вывода при запуске — до тех пор, пока указанная база данных существует, но после запуска его обнаружится, что два файла базы данных, которые были созданы вызовом CreateDatabase, исчезли.

Вызов этого метода при несуществующей базе данных вызовет генерацию следующего исключения:

Unhandled Exception: System.Data.SqlClient.SqlException: 
An attempt to attach an auto-named database for file C:\NORTHWND.MDF failed. 
A database with the same name exists, or specified file 
cannot be opened, or it is located on UNC share.

Необработанное исключение: System.Data.SqlClient.SqlException: 
Попытка присоединения к автоматически именованной базе данных для файла С:\NORTHWND.MDF
 завершилась сбоем. База данных с тем же именем уже существует, 
 или указанной файл не может быть открыт, 
 или он расположен на разделяемом ресурсе UNC.
Пройди тесты
Лучший чат для C# программистов