在C#中创建(按需)SQL Server 2008 Express数据库的最佳实践?

ile*_*eon 5 c# sql-server ado.net sql-server-express winforms

目的是在全新的SQL Server 2008 Express数据库中处理用户的数据(您可以将其称为项目,文档,文件或其他内容).预计数据占用的空间将远远少于快递版本的4GB空间(也可免费分发).

例如,每次用户选择File-> New命令时,将在指定位置创建一个新的空数据库.另一方面,类似的命令File-> Open必须提供支持以检索数据库列表以选择一个用于打开的数据库.

因此,必须解决以下问题:a)应用程序必须能够创建连接字符串并通过代码(C#)将数据库附加到SQL Server 2008 Express b)应用程序必须能够检索(再次通过代码)a列出所有可用的数据库,以便用户有机会选择一个打开.

我认为在资源中使用模板数据库并将其复制到用户指定的位置会很有帮助.

你认为这是一个有效的解决方案吗?你有什么建议吗?

Rob*_*vey 17

你可以使用Sql Server管理对象(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;
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 哇,这让我很开心。其他所有人都在试图劝阻问询者不要尝试此解决方案,而您只是随随便便就用简短,简洁,简洁的代码清单来回答它。恭喜,先生,您赢得了我的支持。 (2认同)