2−1 SQL Server Compactを利用してみました

 Visual Basic 2008 Express Editionが Microsoft社から無料でダウンロードできるというので、使ってみることにした。やりたい事は データベースへの接続である。ダウンロードとインストールはMicrosoftのホームページを参照して見て下さい。(なお、Visual Basic 2008はXPのSP2以降しか対応していないようで、注意が必要である)
 いくつかのホームページを検索してAccessのデータベースに接続するためのサンプルコードを見つけた。Visual BASIC 2008 Express Edition実践入門というホームページがそれである。このページ内の【MDBファイルを開き読む】という場所ににAccessへ接続するためのサンプルコードが記載されていたので これを利用し、Access2007のデータベースへ 早速接続してみる。

商品グループ 商品番号 商品名 単価
おかし 1000 ぬれ煎餅 128
おかし 1010 黒糖せんべい 158
おかし 1020 ハッピーターン 138

1.CドライブにTESTホルダーを作成し、testdb.accdbというデータベースを作成。
2.データベースに商品テーブルを作成。
3.商品グループ・商品番号・商品名・単価という四つのフィールドを作成。(なお、商品番号は固有キーとしている)
4.ここで、Visual Basic 2008 Express Editionを起動。新しいプロジェクトを作成すると、自動的にフォームが作成されるので、ここにボタンコントロールとリストボックスだけのフォームを作成。サンプルのプログラムをそのまま入力する。
(なお、データベースの位置と名前はC:\Test\Testdb.accde、テーブル名は「商品」、フィールド名はそれぞれ「商品グループ・商品番号・商品名・単価」とした。)
5.ここで問題となるのが、接続文字列であるが、これはデータソースエクスプローラーで接続のテストを行える画面を開くと参照できる。この場合は、「Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Test\testdb.accdb」という文字列を設定する。
6.動作のテストを行い、正常にデータが読み込める事が確認できた。

 ここまででデータベース接続の初歩の初歩は出来たので、次は自動的にインストールされたSQL Server Compactを利用してみることとする。色々なホームページを参照してみると、サーバーエクスプローラー(データベースエクスプローラー)等からプロバイダーを選択し データベースへの接続を行うように書かれているが、自分の環境ではExpress Editionを使っているせいか プロバイダーの接続の画面が出てこない。
 まあ、タダで使っているソフトだからそれも仕方がないだろう。ひとまず、接続は後にしてデータベースを作成してみる。

 データベースは、「データベースエクスプローラー」の画面から簡単に作成できる。これらツールの使い方については、「SQL Server Compact オンラインブック」に詳しく書いてあるので、まずはこのオンラインブックをダウンロードしてインストールを行い内容を見てほしい。簡単なウイザードに従って設定してゆけばデータベースの作成もテーブルの作成も簡単に行える。さらに、データの登録も「データベースエクスプローラー」から出来てしまう。データベースエクスプローラーコマンドプロムプトからCreate DatabaseやCreate TableなどのSQL文を発行してデータを作成する必要が無いので簡単だ。(ただ、昔ながらのコマンドプロムプトからの処理の行い方についてのヘルプが全く見当たらなかった。ひょっとしたら、そういった使い方が出来ないのかもしれない)。使い方としては、SQL ServerというよりもどちらかといえばAccessに近いように感じる。

 左に示したように、MyDatabase#1.sdfというデータベース、及び商品テーブル。各列を作成している。データの参照は、商品テーブルを右クリックして 「テーブルデータの表示」を行えば 簡単に見ることが出来る。中身のデータはAccessの場合と同じものを入れてみた。ただし ホルダーは「E:\VB2005実践講座1\sqldb\」配下とした。この部分は、自分のPCで使用する時に読み替えてもらいたい。また、データベースのパスワードはテストのため「PASSWORD」とした。

 ここまでは、事前の準備となるので 「SQL Server Compact オンラインブック」を参照すれば出来る。ただ、この後がどうも解らない。試しに 先程のAccessと同じフォームを作成し、テストを行ってみた。その時のコードは以下のようなものである。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cn As New System.Data.OleDb.OleDbConnection
Dim SQL As System.Data.OleDb.OleDbCommand
Dim dr As System.Data.OleDb.OleDbDataReader

Dim s As String

s = "Data Source=E:\VB2005実践講座1\sqldb\MyDatabase#1.sdf;Password=PASSWORD;Persist Security Info=True;"
cn.ConnectionString = s

SQL = cn.CreateCommand
SQL.CommandText = "SELECT * FROM 商品"

cn.Open()

dr = SQL.ExecuteReader()
'
ListBox1.Items.Clear()

While (dr.Read())
ListBox1.Items.Add(dr("商品グループ") & " " & dr("商品番号") & " " & dr("商品名") & " " & dr("単価"))
End While
'
cn.Close()
SQL.Dispose()
cn.Dispose()
End Sub

 このままテストを行うと、「cn.ConnectionString = s」の部分で「ArgumentExceptionはハンドルされませんでした。」「OLE DBプロバイダがConnectionSrringで指定されませんでした。たとえば'Provider=SQLOLEDB;'などの場合です」と出てしまい、接続が正しく出来ていない事がわかる。「えー?Accessでは出来たのに?」と思うが、データベースが違えば、接続方法も違うようだ。何かヒントはないものか。

 インターネットで調べても、どうも今度はサンプルコードを提示してくれるホームページが見当たらない。仕方がなく、Visual Basic 2008 Express Editionのヘルプを見るが、これでもそれらしい物は見当たらない。
 最後にもう一度「SQL Server Compact オンラインブック」を参照してみると【開発(SQL Server Compact)】−【開発者ガイド(SQL Server Compact)】−【マネージアプリケーションの構築(SQL Server Compact)】−【ディスクトップ用アプリケーションの構築(SQL Server Compact)】と階層をたどっていった場所に、『プロジェクトへのSQL Server Compact 3.5 の追加』という項目があった。この部分にソリューションエクスプローラーで、System.Data.SqlServerCe.Dllへの参照を追加しなければならないと書かれている。早速、このDLLへの参照を追加する。(なお、オンラインブックと違いSystem.Data.SqlServerCe.Dllは、C:\Program Files\Microsoft SQL Server Compact Edition\V3.5\Desktop配下に私の環境の場合は存在していた。似たような名前のファイルがいくつかあるので間違わないように注意が必要である)。
 次に、System.Data.SqlServerCe名前空間を使用するディレクティブを追加するように記載されているので この部分も追加した。コード入力画面

 なお、上に示したように、Visual Basic 2008 Express Editionの場合も命令の補完機能が働き、途中まで文字列を登録すると、対象の候補が一覧表示される。上の例のようにNew System.Dataと入力した後、コンマを入れた時点でSqlServerCeという内容が表示されるので、これを選択する。コネクションの部分も「OleDbConnection」ではなく「SqlCeConnection」と指定するようになる。コネクション、コマンド、リーダー共 同様の名前空間を利用するようにして ソースを変更。ソースは以下のようになった。

Imports System.Data.SqlServerCe

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim cn As New System.Data.SqlServerCe.SqlCeConnection
Dim SQL As System.Data.SqlServerCe.SqlCeCommand
Dim dr As System.Data.SqlServerCe.SqlCeDataReader

Dim s As String

s = "Data Source=E:\VB2005実践講座1\sqldb\MyDatabase#1.sdf;Password=PASSWORD;Persist Security Info=True;"
cn.ConnectionString = s

SQL = cn.CreateCommand
SQL.CommandText = "SELECT * FROM 商品"

cn.Open()

dr = SQL.ExecuteReader()
'
ListBox1.Items.Clear()

While (dr.Read())
ListBox1.Items.Add(dr("商品グループ") & " " & dr("商品番号") & " " & dr("商品名") & " " & dr("単価"))
End While
'
cn.Close()
SQL.Dispose()
cn.Dispose()
End Sub

実行例 このように変更して動作を行った結果、見事に「SQL Server Compact」に接続、データを参照する事が出来た。このような苦労も 製品版を使用すればしなくて済むのだろうが これもまた一つの勉強だと考えれば、納得できよう。
 それにしても、以前(VB6)を使用していた時、データベースへの接続はコンポーネットへの接続を参照すればよく、今回のように「名前空間を使用するディレクティブを追加する」ような事は無かったと思う。これをImports文にてインポートするやり方は、VBというよりもCの考え方に近いように感じる。だんだん 両者のコード記述方法が似通ってくるようになるのだろうか?
 それに、「SQL Server Compact オンラインブック」に書かれているサンプルコードは殆どがC用のコードとなっている。これでは、VBしか知らない人達にとっては難しいと思う。
 Visual Basic 2008 Express Editionが無料で使用出きるのは Microsoft社の開発言語を利用しようとする開発者を育成する事が目的なのだと思うが、どうも敷居が高いように感じるのは私だけだろうか?もっと、初心者にも優しいような作りと豊富なサンプルコードを提供してくれることをMicrosoft社にはお願いしたい。膨大なオンラインブックの中で、「ディスクトップ用アプリケーションの構築」というページ(印刷したら、両面印刷で紙1枚に収まった)が見つけられなかったら、上のコードは書け無かっただろうから。

「市民の目」トップページへ戻る