Цель состоит в том, чтобы обработать данные пользователя (можно назвать их проектом, документом, файлом, или безотносительно) в совершенно новой базе данных SQL Server 2008 Express. Данные, как ожидают, займут намного меньше места, чем 4 ГБ, доступные со специальным выпуском (который также свободен распределить).
Например, каждый раз, когда пользователь выбирает команду File-> New, новая пустая база данных будет создана в указанном местоположении. С другой стороны, подобная команда, Файл-> Открытый должен оказать поддержку для получения списка баз данных для выбора один для открытия.
Так, следующие вопросы должны быть решены: a) приложение должно смочь создать строку подключения и присоединить базу данных к Экспрессу SQL Server 2008 года через код (C#) b) приложение, должен смочь получить (снова через код) список со всеми доступными базами данных, дать пользователю шанс выбрать тот для открытия.
Я думаю, что было бы полезно иметь шаблонную базу данных в ресурсах и скопировать его в месте, указанном пользователем.
Вы думаете, что это - рабочее решение? У Вас есть какие-либо предложения?
С помощью Sql Server Management Objects (SMO) можно многое сделать:
// Add a reference to Microsoft.SqlServer.Smo
// Add a reference to Microsoft.SqlServer.ConnectionInfo
// Add a reference to Microsoft.SqlServer.SqlEnum
using Microsoft.SqlServer.Management.Smo;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Data;
public class SqlServerController
{
private Server m_server = null;
public SqlServerController(string server)
{
m_server = new Server(server);
}
public void AttachDatabase(string database, StringCollection files,
AttachOptions options)
{
m_server.AttachDatabase(database, files, options);
}
public void AddBackupDevice(string name)
{
BackupDevice device = new BackupDevice(m_server, name);
m_server.BackupDevices.Add(device);
}
public string GetServerVersion(string serverName)
{
return m_server.PingSqlServerVersion(serverName).ToString();
}
public int CountActiveConnections(string database)
{
return m_server.GetActiveDBConnectionCount(database);
}
public void DeleteDatabase(string database)
{
m_server.KillDatabase(database);
}
public void DetachDatabase(string database, bool updateStatistics,
bool removeFullTextIndex)
{
m_server.DetachDatabase(database, updateStatistics, removeFullTextIndex);
}
public void CreateDatabase(string database)
{
Database db = new Database(m_server, database);
db.Create();
}
public void CreateTable(string database, string table,
List<Column> columnList, List<Index> indexList)
{
Database db = m_server.Databases[database];
Table newTable = new Table(db, table);
foreach (Column column in columnList)
newTable.Columns.Add(column);
if (indexList != null)
{
foreach (Index index in indexList)
newTable.Indexes.Add(index);
}
newTable.Create();
}
public Column CreateColumn(string name, DataType type, string @default,
bool isIdentity, bool nullable)
{
Column column = new Column();
column.DataType = type;
column.Default = @default;
column.Identity = isIdentity;
column.Nullable = nullable;
return column;
}
public Index CreateIndex(string name, bool isClustered, IndexKeyType type,
string[] columnNameList)
{
Index index = new Index();
index.Name = name;
index.IndexKeyType = type;
index.IsClustered = isClustered;
foreach (string columnName in columnNameList)
index.IndexedColumns.Add(new IndexedColumn(index, columnName));
return index;
}
}
У меня сложилось впечатление, что эта база данных будет жить локально на машине пользователя. В этом случае sql server express обычно не является хорошим выбором для базы данных. Это движок серверного класса, а не рабочий стол или движок в процессе. Вместо этого вы можете использовать ряд хороших движков процессов: Sql Server Compact Edition, Sqlite (как упомянул Джейкоб) или даже Access.
Если вы считаете, что SQL Server Express 2008 - правильный выбор (хотя sqllite, кажется, подходит лучше), я бы посмотрел на использование пользовательских экземпляров , которые позволят администраторам добавлять базы данных из файлов, как вы описывать.
Альтернативным решением является использование SQLite, а не SQL Express. Вы даже можете продолжать использовать ADO.NET, если используете это решение. Базы данных SQLite - это просто файлы, и ваши строки подключения могут ссылаться на путь к файлу. Когда пользователь хочет открыть свой файл, он может выбрать фактический файл.
В этой статье показано, как создать новую базу данных и присоединить ее к экземпляру базы данных SQL Server:
Как: прикрепить файл базы данных к SQL Server Express
http://msdn.microsoft.com/en-us/library/ms165673.aspx
В этой статье показано, как управлять подключением и отключением существующих баз данных: http : //msdn.microsoft.com/en-us/library/ms190794.aspx