8

Как я могу создать «код» для создания новой базы данных .mdf/.sdf?Создайте базу данных .mdf/.sdf динамически

Я попытался это: http://support.microsoft.com/kb/307283

Все это делает неудачу на ConnectionString. Поскольку у меня нет связи с файлом, который существует до его создания, как я могу подключиться только к серверу SQL Express только для создания базы данных mdf/sdf?

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

Любые предложения?

+1

http://whereslou.com/2008/10/20/create-a-sqlexpress-database-file-from-code –

+0

У вас есть возможность использовать SQL Server CE? он имеет эту функциональность .. как только на основе строки подключения – gordatron

ответ

15
public static void CreateSqlDatabase(string filename) 
{ 
    string databaseName = System.IO.Path.GetFileNameWithoutExtension(filename); 
    using (var connection = new System.Data.SqlClient.SqlConnection(
     "Data Source=.\\sqlexpress;Initial Catalog=tempdb; Integrated Security=true;User Instance=True;")) 
    { 
     connection.Open(); 
     using (var command = connection.CreateCommand()) 
     { 
      command.CommandText = 
       String.Format("CREATE DATABASE {0} ON PRIMARY (NAME={0}, FILENAME='{1}')", databaseName, filename); 
      command.ExecuteNonQuery(); 

      command.CommandText = 
       String.Format("EXEC sp_detach_db '{0}', 'true'", databaseName); 
      command.ExecuteNonQuery(); 
     } 
    } 
} 

Изменение Catalog=tempdb к Catalog=master, его хорошо работал

Пример использования:

var filename = System.IO.Path.Combine("D:\\", "testdb.mdf"); 
if (!System.IO.File.Exists(filename)) 
{ 
    CreateSqlDatabase(filename); 
} 
+0

Это сработало. Но позже я вообще не могу подключиться к файлу данных. Строка соединения SQL работает при создании файла, но позже соединение с ней дает мне много разных ошибок. Если я использую этот метод для создания файла «mdf» в CurrentDirectory, как его использовать позже? – Deukalion

+0

Прямо сейчас, я получаю ошибки, заявляя, что база данных уже существует, но нет никакого файла, связанного с ней. Разве база данных, таблицы и не содержится в файле «MDF»? Поскольку их нет, как может быть база данных без файла? – Deukalion

+0

change Catalog = tempdb to Catalog = master, хорошо работает –

0

Убедитесь, что у вас есть действующая строка подключения.

Необходимая база данных/каталог должен быть установлен в действительную базу данных, обычно это может быть «мастер», который всегда доступен, и поскольку вы будете использовать мастер для создания базы данных.

2

Что касается файлов .sdf (SQL Server CE), вы можете использовать класс SqlCeEngine для создания новой базы данных, как описано в this MSDN article.

0

Если вам необходимо создать базу данных с нуля программно, я нормально перехожу в SQL Server Management Studio и создаю ее через gui на первом шаге. Но вместо того, чтобы нажимать кнопку ОК в правом нижнем углу, я нажимаю кнопку «Сценарий» на верхней панели инструментов. Это даст мне полный sql-скрипт для создания базы данных, которую я хотел бы иметь. Затем я могу изменить сценарий и изменить части, которые мне бы хотелось динамически.

0

Я полагаю, что проблема - в ConnectionString. Он должен указывать на действительный экземпляр мастера db (как в статье, на которую вы ссылаетесь). Убедитесь, что он правильный, и он должен работать.

+0

Но я хочу, чтобы программа создала его с кодом. – Deukalion

0

Используйте соединениеString с InitialCatalog = master. Поскольку только мастер имеет доступ по умолчанию для создания базы данных.

0

Создание базы данных .sdf

using System.Data.SqlServerCe; 
using System.IO; 
    string folderPath="D:\\Compact_DB" 
    string connectionString; 
    string fileName =folderPath+"\\School.sdf"; 
    string password = "12345"; 

    if (File.Exists(fileName)) 
    { 
    File.Delete(fileName); 
    } 

    connectionString = string.Format("DataSource=\"{0}\"; Password='{1}'", fileName, password); 
    SqlCeEngine obj_ceEngine = new SqlCeEngine(connectionString); 
    obj_ceEngine.CreateDatabase(); 
Смежные вопросы