0

C#、ADO.Net、およびServerManagementStudioで作成した埋め込みMSSQL2008データベースファイル(MS SQL 2008 Expressに接続)を使用してデータベースアプリケーションを作成しました。データベースファイルが見つからない場合(アプリケーションをインストールした直後など)にプログラムでデータベースファイルを作成する方法を説明しているリソースを誰かに教えてもらえますか?

4

2 に答える 2

2

それが私だった場合(それが私であるとき...):

データベースファイルをコピーして添付することで、データベースファイルを機能させようとする必要は特にありません。そうする理由はいくつかありますが、これらはルールではなく例外であると私は信じています。

したがって、データベースのスクリプト作成をスクリプト化する必要があります。つまり、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
    );

すべてが更新ごとのトランザクションにまとめられているため、更新が失敗した場合は、データベースを正常な状態のままにしておく必要があります。

なぜこのようにするのですか(コードでは、試行がないわけではありませんか?)最終結果は、アプリが通信しているスキーマが、アプリが通信することを期待しているスキーマであるという高い信頼度です...正しいテーブル、適切な列(適切な順序、適切なタイプと適切な長さ)など、これは今後も続くでしょう。

これが少し長い場合はお詫びしますが、これは私が非常に熱心に取り組んでいることです...

于 2009-11-11T15:40:24.780 に答える
0

「組み込みMSSQL」が「MicrosoftSQLServerCompact3.5」の場合:

using (SqlCeEngine sqlCeEngine = new SqlCeEngine(connectionString))
  sqlCeEngine.CreateDatabase();
于 2009-11-11T15:02:45.190 に答える