sql >> データベース >  >> RDS >> Sqlserver

埋め込み SQL 2008 データベース ファイルが存在しない場合、それを作成する方法は?

    私だったら (私だったら...):

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

    したがって、データベースの作成をスクリプト化する必要があります。つまり、SQL DDL を使用してデータベースとテーブル、およびスキーマ内の他のすべてのものを作成する必要があります。

    これを可能にするために必要なのは、サーバー インスタンスに対する適切な権限と、接続文字列 (おそらくサーバー/インスタンス名とは別に構築できる) だけです。

    ここから:

    <オール>
  1. データベースはありますか?そうでない場合は作成してください。
  2. データベースがある場合、スキーマのバージョンは適切ですか?低すぎる場合は、更新するか、ユーザーにアドバイスして、物事をどのように機能させたいかに応じて、適切に元に戻します。高すぎる場合は、取り消して、アプリケーションの更新バージョンが必要であることを伝えます
  3. 万事順調です。続けてください。
  4. コードの観点から:データベースが存在するかどうかを判断する方法。バージョン テーブルとバージョン番号 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(); { SqlCommand cmd =new SqlCommand(); を試してください。 cmd.Connection =this.DBConnection; cmd.CommandText ="SELECT COUNT(name) FROM sysdatabases WHERE name =@DBName"; cmd.Parameters.AddWithValue("@DBName", this.DBName);存在 =(Convert.ToInt32(cmd.ExecuteScalar()) ==1); } 最後に { this.DBConnection.Close();戻り値が存在します。 }  

    新しいデータベースを作成します:

     public virtual void CreateNew() { string createDDL =@"CREATE DATABASE [" + this.DBName + "]"; this.BuildMasterConnectionString(); this.DBConnection.Open(); { this.ExecuteSQLStmt(createDDL, this.DefaultSQLTimeout, null); を試してください。 } 最後に { 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(); { this.ExecuteSQLStmt(createDDL, this.DefaultSQLTimeout, null); を試してください。 } catch (Exception ex) { throw new Exception("AAASchemaVersion の作成中または初期化中の例外", ex); } 最後に { 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 AuditUserADD CONSTRAINT PK_AuditUser PRIMARY KEY CLUSTERED ( ID )、CONSTRAINT [FK_AuditUser_UserSourceType] FOREIGN KEY ( UserSourceTypeID ) REFERENCES UserSourceType ( ID );  

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

    なぜこのようにするのですか (コードでは、試行がないわけではありませんか?) まあ、最終結果は、アプリが対話しているスキーマが、アプリが対話することを期待しているスキーマであるという高い信頼性です...正しいテーブル、正しい列 (正しい順序で、正しいタイプと正しい長さ) などであり、これは時間の経過とともに引き続き当てはまります。

    これが少し長い場合は申し訳ありませんが、これは私が非常に熱心に取り組んでいるものです...



    1. MySQLのようなクエリは5000レコードテーブルに対して非常に遅く実行されます

    2. PSQLException:エラー:列のnull値が非null制約に違反しています

    3. Oracleのsdo_geometryからlatとlongを取得する方法

    4. PHPでGETリクエストを介して入力の名前を渡す方法