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

我使用C#,ADO.Net和我在Server Management Studio中创建的嵌入式MS SQL 2008数据库文件(附加到MS SQL 2008 Express)创建了一个数据库应用程序。 有人能指出我的资源,描述如果缺少数据库文件(如我的应用程序安装后),我可以以编程方式创建数据库文件吗?

如果是我(当它是我……):

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

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

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

从这里:

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

从代码的角度来看:确定数据库是否存在的方法; 使用版本表和版本号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 ); 

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

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

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

如果“嵌入式MS SQL”是“Microsoft SQL Server Compact 3.5”:

 using (SqlCeEngine sqlCeEngine = new SqlCeEngine(connectionString)) sqlCeEngine.CreateDatabase();