C#、ADO.Net、およびServerManagementStudioで作成した埋め込みMSSQL2008データベースファイル(MS SQL 2008 Expressに接続)を使用してデータベースアプリケーションを作成しました。データベースファイルが見つからない場合(アプリケーションをインストールした直後など)にプログラムでデータベースファイルを作成する方法を説明しているリソースを誰かに教えてもらえますか?
2 に答える
それが私だった場合(それが私であるとき...):
データベースファイルをコピーして添付することで、データベースファイルを機能させようとする必要は特にありません。そうする理由はいくつかありますが、これらはルールではなく例外であると私は信じています。
したがって、データベースのスクリプト作成をスクリプト化する必要があります。つまり、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
);
すべてが更新ごとのトランザクションにまとめられているため、更新が失敗した場合は、データベースを正常な状態のままにしておく必要があります。
なぜこのようにするのですか(コードでは、試行がないわけではありませんか?)最終結果は、アプリが通信しているスキーマが、アプリが通信することを期待しているスキーマであるという高い信頼度です...正しいテーブル、適切な列(適切な順序、適切なタイプと適切な長さ)など、これは今後も続くでしょう。
これが少し長い場合はお詫びしますが、これは私が非常に熱心に取り組んでいることです...
「組み込みMSSQL」が「MicrosoftSQLServerCompact3.5」の場合:
using (SqlCeEngine sqlCeEngine = new SqlCeEngine(connectionString))
sqlCeEngine.CreateDatabase();