.NET TIPS

アプリケーション内でデータベースをアタッチするには?[C#、VB]

デジタルアドバンテージ 岸本 真二郎
2008/02/21

 データベースを利用するアプリケーションを配布したり、出来上がったWebアプリケーションをサーバにインストールしたりするような状況では、アプリケーションの実行前にデータベースの準備が必要になる。

 これには、事前に保存しておいたデータベースのスキーマ情報を用いて、利用するデータベース・サーバにデータベースを構築したり、SQL Serverでは、開発環境で使用したデータベースをデタッチし、データベース・ファイル(.mdfファイル)をコピーしてから、目的のSQL Serverでアタッチすることもできる。ほかにも、データベースのバックアップを作成しておき、目的のSQL Server上でデータベースを復元したり、SQL Server 2000ならDTSエクスポート機能を使ってデータベースをコピーしたりすることも可能だ。

 いずれの方法をとるにしても、SQL Serverの管理ツールを使ってデータベースの構築を手作業で行う必要があるのだが、データベースのアタッチについては、アプリケーションから簡単に行うことができる。

 そこで本稿では、あらかじめデータベース・ファイルを用意しておいて、アプリケーションからデータベースのアタッチを行う方法を紹介する。

アプリケーションからデータベースをアタッチする

 アプリケーションからデータベースをアタッチするには、まず次のような接続文字列を用意する。

Server=.\SQLEXPRESS; AttachDbFilename=|DataDirectory|\Northwnd.mdf; Database=Northwind; integrated security=true;

 この中の「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」というデータベース名でアタッチするものだ。

using (SqlConnection cn = new SqlConnection())
{
  cn.ConnectionString = @"Server=.\YUKON;"
             + @"AttachDbFilename=|DataDirectory|\Northwnd.mdf;"
             + "Database=Northwind;"
             + "integrated security=true";
  cn.Open();
  cn.Close();
}
Using cn As New SqlConnection()
  cn.ConnectionString = "Server=.\YUKON;" _
          + "AttachDbFilename=|DataDirectory|\Northwnd.mdf;" _
          + "Database=Northwind;" _
          + "integrated security=true;"
  cn.Open()
  cn.Close()
End Using
Northwnd.mdfのアタッチ(上:C#、下:VB)

目的のデータベースが存在するかどうか確かめる

 すでにデータベースがアタッチされているのに、さらにデータベースをアタッチするのは無駄であるため、目的のデータベースがSQL Server上に存在するかどうかを事前に確認した方がよい。実際にそのデータベースに接続してみて、接続に失敗するならデータベースが存在しないと判断してもいいのだが、より的確な方法として、ここでは、「masterデータベース」に接続して、期待するデータベース名が含まれているどうかを確認してみる。

 masterデータベースに接続するには、接続文字列のデータベース名に「master」を指定する。

Server=.\SQLEXPRESS;Database=master;integrated security=true

 接続が行えたら、目的のデータベース名が存在するかどうかをチェックする。「Northwind」というデータベースが存在するかどうか調べるには、次のようなクエリを発行するコードを実行すればよい。

using (SqlConnection cn = new SqlConnection())
{
  using( SqlCommand cmd = cn.CreateCommand())
{
    cn.ConnectionString = @"Server=.\SQLEXPRESS;"
                          +"Database=master;"
                          +"integrated security=true";
    cn.Open();
    cmd.CommandText =
      "SELECT COUNT(*) FROM sysdatabases WHERE name='Northwind'";
    int count = (int)cmd.ExecuteScalar();
    if (count == 1)
    {
      // データベースが存在する
    }
    cn.Close();
  }
}
Using cn As New SqlConnection()
  Using cmd As SqlCommand = cn.CreateCommand()
    cn.ConnectionString = "Server=.\SQLEXPRESS;" _
                          + "Database=master;" _
                          + "integrated security=true"
    cn.Open()
    cmd.CommandText = _
      "SELECT COUNT(*) FROM sysdatabases WHERE name='Northwind'"
    Dim count As Integer = CType(cmd.ExecuteScalar(), Integer)
    If (count = 1) Then
      'データベースが存在する
    End If
    cn.Close()
  End Using
End Using
データベースが存在するかどうかをチェックする(上:C#、下:VB)

 このクエリは、sysdatabasesテーブルのnameカラムが「Northwind」であるレコード数を求める。sysdatabasesテーブルはSQL Serverが管理するシステム・テーブルと呼ばれる特別なテーブルに含まれるもので、インスタンスに含まれるデータベースごとに1レコードが格納されている。このテーブルには、データベース名(name)のほかにデータベースID、データベースの作成日などが含まれている。なお、SQL Server 2005では下位互換性を保つためシステムビュー(sys.databases)として残されている。

 ExecuteScalarメソッドの戻り値は、クエリで得られたレコード数が返されるので、「Northwind」が1個以上含まれていれば必ず1が返ってくる。「Northwind」が含まれない場合はレコード数が0となるので、これを基にデータベースが存在するかどうかが判断できるわけだ。End of Article

カテゴリ:データベース 処理対象:SQL Server 2005
使用ライブラリ:SqlConnnectionクラス(System.Data名前空間)

この記事と関連性の高い別の.NET TIPS
手軽にSQL Serverのデータベースをコピーするには?
[ASP.NET]Express Edition以外のSQL Serverでフォーム認証を利用するには?
[ASP.NET]GridViewコントロールでデータソースの内容を表示するには?
[ASP.NET]SQL Serverモードのセッション管理で情報を永続化するには?
[ASP.NET]セッション情報をSQL Server上で管理するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第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用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間