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