我使用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 );
所有事务都包含在每次更新的事务中 – 因此,如果更新失败,您应该让数据库处于已知良好状态.
为什么这样做(在代码中,这不是没有它的试验?)最终结果是高度自信,你的应用正在与之交谈的架构是你的应用期望与之交谈的架构……正确的表格,右列(按照正确的顺序,正确的类型和正确的长度)等等,随着时间的推移,情况将继续如此.
抱歉,如果这有点长 – 但这是我非常热衷的事情……