当前位置 : 主页 > 编程语言 > c语言 >

c# – 如果不存在,如何创建“嵌入式”SQL 2008数据库文件?

来源:互联网 收集:自由互联 发布时间:2021-06-25
我使用C#,ADO.Net和我在Server Management Studio中创建的嵌入式MS SQL 2008数据库文件(附加到MS SQL 2008 Express)创建了一个数据库应用程序.有人能指出我的资源,描述我如何以编程方式创建数据库文
我使用C#,ADO.Net和我在Server Management Studio中创建的嵌入式MS SQL 2008数据库文件(附加到MS SQL 2008 Express)创建了一个数据库应用程序.有人能指出我的资源,描述我如何以编程方式创建数据库文件,如果它丢失(就像我的应用程序安装后)? 如果是我(当它是我……):

您并不特别想通过复制和附加数据库文件来尝试使数据库文件工作 – 您可能会有这样的理由,但我认为这些是例外而不是规则.

因此,您需要做的是编写数据库的脚本,即使用SQL DDL创建数据库以及表和模式中的所有其他内容.

几乎所有你需要的才能让你这样做是对服务器实例的适当权利,然后是连接字符串(你可以在服务器/实例名称之外建立它).

从这里:

>有数据库吗?如果没有创建它.
>如果有数据库,它是否是正确的架构版本?如果太低则更新它或建议用户并优雅地退出,具体取决于你想要的东西如何工作.如果太高则退出并建议需要更新版本的应用程序
>一切都是应有的,继续.

从代码的角度来看:确定数据库是否存在的方法;使用版本表和版本号0创建标准“空”数据库的方法;通过运行适当的DDL将模式升级到当前版本的方法(我们将我们编码为C#,因为它提供了更大的灵活性,但您可以按顺序运行DDL脚本).

它是否存在:

public virtual bool Exists()
    {
        bool exists = false;

        string masterConnectionString = this.CreateConnectionString(this.Server, this.FailoverServer, "master");

        this.DBConnection.ConnectionString = masterConnectionString;
        this.DBConnection.Open();
        try
        {
            SqlCommand cmd = new SqlCommand();
            cmd.Connection = this.DBConnection;
            cmd.CommandText = "SELECT COUNT(name) FROM sysdatabases WHERE name = @DBName";
            cmd.Parameters.AddWithValue("@DBName", this.DBName);

            exists = (Convert.ToInt32(cmd.ExecuteScalar()) == 1);
        }
        finally
        {
            this.DBConnection.Close();
        }

        return exists;
    }

创建一个新数据库:

public virtual void CreateNew()
    {
        string createDDL = @"CREATE DATABASE [" + this.DBName + "]";

        this.BuildMasterConnectionString();

        this.DBConnection.Open();
        try
        {
            this.ExecuteSQLStmt(createDDL, this.DefaultSQLTimeout, null);
        }
        finally
        {
            this.DBConnection.Close();
        }

        createDDL = @"
                CREATE TABLE AAASchemaVersion 
                (
                    Version         int             NOT NULL,
                    DateCreated     datetime        NOT NULL,
                    Author          nvarchar(30)    NOT NULL,
                    Notes           nvarchar(MAX)   NULL 
                );

                ALTER TABLE AAASchemaVersion ADD CONSTRAINT PK_Version PRIMARY KEY CLUSTERED
                (
                    Version
                );

                INSERT INTO AAASchemaVersion
                    (Version, DateCreated, Author, Notes)
                VALUES
                    (0, GETDATE(), 'James Murphy', 'Empty Database')
            ";

        this.BuildConnectionString();
        this.ConnectionString += ";pooling=false";

        this.DBConnection.Open();
        try
        {
            this.ExecuteSQLStmt(createDDL, this.DefaultSQLTimeout, null);
        }
        catch (Exception ex)
        {
            throw new Exception("Exception while creating / initialising AAASchemaVersion", ex);
        }
        finally
        {
            this.DBConnection.Close();
        }
    }

更新代码有点复杂,但基本上运行这样的东西:

CREATE TABLE AuditUser
(    
    ID                  int IDENTITY(1,1)   NOT NULL,
    UserSourceTypeID    tinyint             NOT NULL,
    DateCreated         smalldatetime       NOT NULL,
    UserName            nvarchar(100)       NOT NULL        
);
ALTER TABLE AuditUser
ADD CONSTRAINT
    PK_AuditUser PRIMARY KEY CLUSTERED
    (
        ID
    ),
    CONSTRAINT [FK_AuditUser_UserSourceType] FOREIGN KEY
    (
        UserSourceTypeID
    ) REFERENCES UserSourceType (
        ID
    );

所有事务都包含在每次更新的事务中 – 因此,如果更新失败,您应该让数据库处于已知良好状态.

为什么这样做(在代码中,这不是没有它的试验?)最终结果是高度自信,你的应用正在与之交谈的架构是你的应用期望与之交谈的架构……正确的表格,右列(按照正确的顺序,正确的类型和正确的长度)等等,随着时间的推移,情况将继续如此.

抱歉,如果这有点长 – 但这是我非常热衷的事情……

网友评论