.NET TIPS アプリケーション内でデータベースをアタッチするには?[C#、VB]デジタルアドバンテージ 岸本 真二郎2008/02/21 |
|
|
データベースを利用するアプリケーションを配布したり、出来上がったWebアプリケーションをサーバにインストールしたりするような状況では、アプリケーションの実行前にデータベースの準備が必要になる。
これには、事前に保存しておいたデータベースのスキーマ情報を用いて、利用するデータベース・サーバにデータベースを構築したり、SQL Serverでは、開発環境で使用したデータベースをデタッチし、データベース・ファイル(.mdfファイル)をコピーしてから、目的のSQL Serverでアタッチすることもできる。ほかにも、データベースのバックアップを作成しておき、目的のSQL Server上でデータベースを復元したり、SQL Server 2000ならDTSエクスポート機能を使ってデータベースをコピーしたりすることも可能だ。
いずれの方法をとるにしても、SQL Serverの管理ツールを使ってデータベースの構築を手作業で行う必要があるのだが、データベースのアタッチについては、アプリケーションから簡単に行うことができる。
そこで本稿では、あらかじめデータベース・ファイルを用意しておいて、アプリケーションからデータベースのアタッチを行う方法を紹介する。
アプリケーションからデータベースをアタッチする
アプリケーションからデータベースをアタッチするには、まず次のような接続文字列を用意する。
|
この中の「AttachDbFilenameキーワード」で、アタッチするデータベース・ファイルを指定する。「|DataDirectory|」は、相対ディレクトリを指すもので、この場合はアプリケーションの実行ディレクトリが参照される。例えば、プログラムが、
C:\Program files\Sample\app
に置かれているとすると、「|DataDirectory|\sample.mdf」は、
C:\Program files\Sample\app\sample.mdf
というファイル名に展開される。指定するデータベース・ファイルは、事前にSQL Server上でデータベースを作成しておき、一度デタッチしたデータベース・ファイルをコピーしておけばよい。このときログ・ファイル(.ldfファイル)は不要である(アタッチ時に新規に作成される)。
また、「Databaseキーワード」はアタッチするデータベース名を指定するもので、上記の例では「Northwind」というデータベース名でアタッチされる。Databaseを指定しないとAttachDBFilenameで指定したファイル名がデータベース名となる。
以下のコードはアプリケーションの実行ディレクトリにある「Northwnd.mdf」ファイルを「Northwind」というデータベース名でアタッチするものだ。
| ||
Northwnd.mdfのアタッチ(上:C#、下:VB) |
目的のデータベースが存在するかどうか確かめる
すでにデータベースがアタッチされているのに、さらにデータベースをアタッチするのは無駄であるため、目的のデータベースがSQL Server上に存在するかどうかを事前に確認した方がよい。実際にそのデータベースに接続してみて、接続に失敗するならデータベースが存在しないと判断してもいいのだが、より的確な方法として、ここでは、「masterデータベース」に接続して、期待するデータベース名が含まれているどうかを確認してみる。
masterデータベースに接続するには、接続文字列のデータベース名に「master」を指定する。
|
接続が行えたら、目的のデータベース名が存在するかどうかをチェックする。「Northwind」というデータベースが存在するかどうか調べるには、次のようなクエリを発行するコードを実行すればよい。
| ||
データベースが存在するかどうかをチェックする(上:C#、下:VB) |
このクエリは、sysdatabasesテーブルのnameカラムが「Northwind」であるレコード数を求める。sysdatabasesテーブルはSQL Serverが管理するシステム・テーブルと呼ばれる特別なテーブルに含まれるもので、インスタンスに含まれるデータベースごとに1レコードが格納されている。このテーブルには、データベース名(name)のほかにデータベースID、データベースの作成日などが含まれている。なお、SQL Server 2005では下位互換性を保つためシステムビュー(sys.databases)として残されている。
ExecuteScalarメソッドの戻り値は、クエリで得られたレコード数が返されるので、「Northwind」が1個以上含まれていれば必ず1が返ってくる。「Northwind」が含まれない場合はレコード数が0となるので、これを基にデータベースが存在するかどうかが判断できるわけだ。
カテゴリ:データベース 処理対象:SQL Server 2005 使用ライブラリ:SqlConnnectionクラス(System.Data名前空間) |
「.NET TIPS」 |
- 第2回 簡潔なコーディングのために (2017/7/26)
ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている - 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう - 第1回 明瞭なコーディングのために (2017/7/19)
C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える - Presentation Translator (2017/7/18)
Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
|
|