c# – 如果不存在,如何创建“嵌入式”SQL 2008数据库文件?
我使用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,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 ); 所有事务都包含在每次更新的事务中 – 因此,如果更新失败,您应该让数据库处于已知良好状态. 为什么这样做(在代码中,这不是没有它的试验?)最终结果是高度自信,你的应用正在与之交谈的架构是你的应用期望与之交谈的架构……正确的表格,右列(按照正确的顺序,正确的类型和正确的长度)等等,随着时间的推移,情况将继续如此. 抱歉,如果这有点长 – 但这是我非常热衷的事情…… (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |