本稿はデータベースソフトウェア「SQL Anywhere」およびデータベース全般に関する英語ドキュメントを翻訳する形で提供しています。図など、部分的に英語のままになっていますが、製品のSQL Anywhere自体は完全に日本語化されていますのでご安心ください。
はじめに
最近の業界はサービス指向アーキテクチャ(SOA:Service‐Oriented Architecture)の話題で活気づいているようです。ITグループは情報の流れを実用的なビジネスプロセスモデルの方向へ転換しようとしており、これはデータ供給のしくみが標準化されつつあることを意味します。ここで、標準と呼ばれるものは数知れずありますが、SOAPにかなり勢いがあるように見えます。なお、SOAPは当初、ある別の頭字語を表していました。
柔軟なデータ供給の実現ということの中には、ユーザーが手慣れた方法で簡単にデータを消費でき、それが何よりもユーザーにとって有益であるという意味合いが含まれています。しかし、こうした基準は主観的なものであり、ユーザーや状況が違えば変化します。Microsoft Officeユーザーにデータを供給し、なおかつ、おそらくプラットフォームも異なるであろう専門的なアプリケーション開発者の要求も満たすためにはどうすればよいのでしょう。ユーザーがそれぞれの目的にかなった方法でデータにアクセスできるようにするためには、ユーザーの種類ごとにある種のラッパーやアダプターを提供する必要があるのでしょうか。
答えは、この種の多消費者型の順応性を備えた柔軟な標準を使うことです。幸い、SOAPはまさにその目的をかなえてくれます。Microsoft Officeアプリケーションで社内データにアクセスすることを求められている人々も、統一された標準的なアプリケーションを自分たちで構築しようと考えている人々も、データのプロバイダに個別的な要件を課すことなくそれぞれの目的を実現できます。これは今日の業界が求めているメンテナンスコストの低い順応性を実現するものでもあります。本稿の目的はSOAまたはSOAP自体のメリットや実装を論ずることではなく、それらの原理を現実に即して適用する方法を具体的に説明することにあります。
以前、MicrosoftはWebサービスの統合を促進するために、SOAPツールキットだけでなく、Microsoft Office用のWeb Services Toolkitも提供していました。基本的にどのドキュメントでもWebサービスのデータを利用するには、かなり多くのVBAコードを書く必要がありました。しかし、Microsoft Office 2007とVisual Studio 2008が.NET Framework 3.5と共に登場した時点で、その提供は終了しました。SOAPデータにアクセスするしくみをOfficeドキュメントに組み込む標準的な方法として.NETによる統合が利用されることになったからです。これによって、SOAPソースから取り出したデータを一定の管理された方法で簡単に統合することが可能となります。
本稿では、SQL Anywhere 10データベース内からSOAP/DISH Webサービスを作成し、そのWebサービスからデータを取得するコードが書かれたMicrosoft Excelワークブックを作成し、さらに、そのデータを取得するコードが書かれたMicrosoft Wordドキュメントを作成するまでの手順を具体的に説明します。ここではSQL Anywhere 10のデモデータベースを利用し、'Customer'テーブルからデータを取り出します。
概要
データに関するクライアント側の需要は拡大する一方であり、その需要を何とか満たすために、統一されたデータアクセス手法というものが重要視されるようになっています。SOAPは、クライアントのプラットフォームや目的とは関係なく、データにアクセスすることだけに的を絞ったプロトコルです。このプロトコルは、Microsoft Office 2007ユーザーもアプリケーション開発者も等しくデータにアクセスできるという高い自由度を備えています。本稿では、SQL Anywhereを使用してデータベース駆動型のWebサービスを作成し、SOAP要求を受け取って応答する方法を説明します。さらに、ExcelとWord 2007からデータにアクセスする手順も示します。具体的にはサンプルのクライアントデータを使用してExcelワークシートとWordドキュメントにデータを読み込みます。本稿を読むためにはWebサービスやサービス指向アーキテクチャの概念を熟知していることが望まれますが、その専門家である必要はありません。ただし、Office/C#プログラミングの経験がある読者を対象としています。
要件
- Microsoft Visual Studio 2008
- Microsoft Office Excel 2007
- Microsoft Office Word 2007
- SQL Anywhere 10
SQL Anywhere 10でSOAP/DISH Webサービスを作成する
データをデータベースに格納するのには、効率やセキュリティなど、いくつもの理由があります。データベースに接続してデータを取得する方法は一通りでなく、その目的ごとに特殊化された方法が必要となります。
データをWebサービスとして公開すればデータ消費側の統一性は高まりますが、セットアップに手際を求められることがあります。幸い、SQL Anywhere 10のデータベースエンジンには、要となるWebサーバーテクノロジーが組み込まれているので、データベース内にWebサービスを直接セットアップするだけで済みます。
まず、コンソールからデモデータベースを起動しましょう。使用するコマンドは、dbeng10 demo.db ‐xs http(port=8888)です。ここで、demo.dbは、実際に使うデータベースファイルの名前に置き換えてください。なお、このソリューションを現実の運用環境に展開するときは、dbeng10をdbsrv10に置き換えて他のマシンからの要求を受け付けることができるようにする必要があります。
ここで、‐xsスイッチに注目してください。ここはSQL Anywhereのマジックがよくわかる場所です。このスイッチは、データベースエンジン(dbeng10)に対して、ポート8888に結合し、HTTP要求を受け付けるよう指示しています。補助的なWebサーバーアプリケーションは必要ありません。
データベースエンジンが稼働しているので、SOAPサービスを作成できます。この作業は、SQL Anywhereのデータベース管理ツールであるSybase Centralから短時間で手際よく行うことができます。
Sybase Centralを起動した後、[Connections]メニューの[Connect with SQL Anywhere 10...]をクリックします。
入力が促されたら、ユーザー名として'dba'、パスワードとして'sql'を入力します。これらはSQL Anywhereに付属するデモデータベースにログインするための資格情報です。これらの値は、必ず実際のログイン資格情報と置き換えてください。[Database]タブをクリックして次の作業に進みます。
サーバー名のフィールドに'demo'と入力します。これは以前のステップで開始したデータベースエンジンの名前です。この値は、必ず実際のデータベースエンジンの名前と置き換えてください。入力後、[OK]をクリックします。
[Web Services]をダブルクリックし、左側にあるタスクの一覧から[Create a web service...]を選択します。
ウィザードが起動され、名前の入力が促されます。'MySOAP/MyData'と入力し、[Next]をクリックします。Webサービスの種類を指定するよう促されたら、'SOAP'を選択し、[Next]をクリックします。
ここで実際に選択できるフォーマットにはいくつか種類があります。'RAW'を選択すると、Webブラウザーでサービスをブラウズするとき未加工のテキストが出力されます。'XML'と'HTML'では、XML/HTTPリーダー用のマークアップ言語でデータがフォーマットされます。今は汎用的なサービス指向のプロバイダを作成しようとしているので、'SOAP'を選択します。本稿では、'SOAP'と共に'DISH'サービスがどう使われるかを説明します。
入力が促されたら、Data Payload Format(データペイロードフォーマット)として'Default'を選択し、[Next]をクリックします。Data Type Behaviour(データの型付け動作)については、'Off'を選択し、[Next]をクリックします。
柔軟で汎用的なサービスを作成することが目的なので、ここではデフォルトのSOAPフォーマットを使います。無論、Javaの標準的なアプリケーションや.NETアプリケーション内から個別限定的なデータフォーマットを使用することもできます。クライアント側のデータアクセスには.NET Frameworkが使われますが、Defaultフォーマットを選択すれば、サービスの柔軟性が保持されます。データの型付けは、複雑なので無視されます。この例のデータは、いずれにせよテキストとして扱われるので、データの型付けは必要ありません。
入力が促されたら、[Require authorization for this service]チェックボックスをオフにし、'DBA'ユーザーを選択し、[Next]をクリックします。[Require security for this service]チェックボックスはオフのままで、[Next]をクリックします。
実際のところ、実務に関わるWebサービスでは、許可を与えることとセキュリティを守ることは、サービスの根幹を成す要素です。しかし、これは本稿の目的から外れるので、無視します。
入力が促されたら、SQLステートメントとしてSELECT * FROM Customersを入力し、[Next]をクリックします。必要ならコメントを入力し、最後に[Finish]をクリックします。
以上でSOAPサービスが作成されましたが、統一的なWebサービスの作成は完了していません。SOAPサービスによって何が提供されているかをデータ消費者側が理解できるようにするためにDISHサービスが必要です。これは、本質的にはSOAPサービスのインターフェイスを定義するしくみであり、厳密に言えば、Web Service Definition Language(WSDL)仕様を生成するサービスです。
これを作成するため、再び[Create a web service...]をクリックします。今度は、サービスの名前として'MyDISH'を入力し、種類としてDISHを選択します。入力が促されたら、データフォーマットとして'Default'を選択します。「このDISHサービスで使用するSOAPサービス名の接頭辞は?」('What is the SOAP service name prefix for this DISH service?', enter the value 'MySOAP')という質問に対して、値'MySOAP'を入力します。
以前のステップでSOAPサービスに付けた名前は'MySOAP/MyData'でした。これで、接頭辞'MySOAP'を持つ'MyData'という名前のWebサービスが実際に作成されます。DISHサービスの作成時に接頭辞として'MySOAP'を指定すると、この接頭辞を持つすべてのサービスに対する定義がDISHサービスで生成されるようになります。
残りのフィールドについては、以前と同じ値を選択します。以上でWebサービスの作成は完了です。
Excel 2007でWebサービスのデータを使用する
ここでは、既存のWebサービスのデータを使用することを考えます。クライアントがMicrosoft Officeを使用しているものと仮定します。現在、Microsoft Officeプログラムのオートメーションやプログラミングは、以前のようにVBA用のスクリプト環境を使う方法ではなく、Visual Studio 2008で直接行うようになっています。Visual Studio 2008の起動後、新規のOffice 2007 Excel Workbookプロジェクトを作成し、それに名前'MyEXCEL'を付け、[OK]をクリックします。
入力が促されたら、新規のExcelワークブックを作成することに同意し、[OK]をクリックします。なお、状況によっては、この操作を行う前に、他のすべてのMicrosoft Office 2007プログラムを閉じる必要があります。これで完全に使用可能な新規のワークブックがVisual Studio内に表示されます。
[Project]メニューの[Add Service Reference...]をクリックします。
入力が促されたら、アドレスフィールドに'http://localhost:8888/MyDISH'と入力し、[Go]をクリックします。これで、先ほど作成したWebサービスが表示されます。
以前作成した'MyData'サービスが[Operations]ボックスに表示されています。その名前空間に'MyService'という値を与え、[OK]をクリックします。これで、Webサービスを使用するためのコードが自動的に作成されます。'app.config'ファイルが自動的に更新されると共に、アプリケーションへの参照が追加されることに注意してください。
次に、ツールボックスからワークシートへ'Button'を追加します。
必要に応じてボタン表面のテキストを変更してから、ボタンをダブルクリックしてコードの編集を開始します。メソッド'private void button1_Click(object sender, EventArgs e)'に対して、次のコードを入力します。
private void button1_Click(object sender, EventArgs e) { int row = 3; //Start inserting values as of row 4 (Row 3 in zero‐base) int sqlCode; DataTableReader reader; //A reader is used to step through the data. MyService.MyDISHSoapPortClient webService; /* Initialize the webservice, the constructor was auto‐created by VS */ webService = new MyEXCEL.MyService.MyDISHSoapPortClient(); /* Use the MyData procedure created in SQL Anywhere to create a reader */ reader = webService.MyData(out sqlCode).CreateDataReader(); /* Read each line of the data table that is returned */ while (reader.Read()) { /* Iterate through each column/field of the current row */ for (int i = 0; i < reader.FieldCount; i++) { /* Write the data value onto the spreadsheet */ this.Cells[row, i + 1] = reader.GetValue(i); } row++; } }
要するに、これはWebサービスからデータを取得して、ワークシートに入れるコードです。これを実現するために'MyService'クラスのインスタンスが生成されます。そのコードはVisual Studioによって自動的に作成されたものです。'DataTableReader'オブジェクトを使用してデータが順に読み込まれ、ワークシートの各セルに値が設定されます。'Debug'ボタンをクリックするか、F5キーを押して、このソリューションをテストします。ワークブックがロードされたら、ボタンをクリックすると、Webサービスからデータが取得され、ワークシート内に自動的に設定されます。
このデータを使用すれば、Excel内からカスタムインボイスを作成するような処理を実現できます。ここでのポイントは、汎用的なWebサービスからデータが自動的に取得され、Webサービスをおのおのの要件に応じて個別に構成しなくてもよいことです。これは簡単なデモですが、パラメータを使うような構成も可能です。つまり、Webサービスのメソッドにパラメータを与え、そのパラメータを使用して、たとえば、個々の顧客に関する特定のデータを顧客のクライアントIDに基づいて取得することができます。
Word 2007でWebサービスのデータを使用する
ここでは、上と同じデータを今度はWordドキュメントで使用することを考えます。基本的な考え方は前と同じで、'Service Reference'を作成し、その上でデータアクセス用に生成されたクラスを利用します。まず、Visual Studio 2008を起動し、新規のOffice 2007 Word Documentプロジェクトを'MyWORD'という名前で作成します。
入力が促されたら、新規のWordドキュメントを作成することに同意し、[OK]をクリックします。なお、状況によっては、この操作を行う前に、他のすべてのMicrosoft Office 2007プログラムを閉じる必要があります。これで完全に使用可能な新規のドキュメントがVisual Studio内に表示されます。
[Project]メニューの[Add Service Reference...]をクリックします。
入力が促されたら、アドレスフィールドに'http://localhost:8888/MyDISH'と入力し、[Go]をクリックします。これで、先ほど作成したWebサービスが表示されます。
以前作成した'MyData'サービスが[Operations]ボックスに表示されています。その名前空間に'MyService'という値を与え、[OK]をクリックします。これで、Webサービスを使用するためのコードが自動的に作成されます。'app.config'ファイルが自動的に更新されると共に、アプリケーションへの参照が追加されることに注意してください。
次に、ツールボックスからドキュメントへ'Button'を追加します。
必要に応じてボタン表面のテキストを変更してから、ボタンをダブルクリックしてコードの編集を開始します。メソッド'private void button1_Click(object sender, EventArgs e)'に対して、次のコードを入力します。
private void button1_Click(object sender, EventArgs e) { int sqlCode; DataTableReader reader; //A reader is used to step through the data. MyService.MyDISHSoapPortClient webService; /* Initialize the webservice, the constructor was auto‐created by VS */ webService = new MyWORD.MyService.MyDISHSoapPortClient(); /* Use the MyData procedure created in SQL Anywhere to create a reader */ reader = webService.MyData(out sqlCode).CreateDataReader(); /* Read each line of the data table that is returned */ while (reader.Read()) { /* Concatenate the names and append it to the page */ this.Paragraphs[1].Range.InsertAfter("\n" + reader.GetValue(1) + ", " + reader.GetValue(2)); } }
要するに、これはWebサービスからデータを取得して、ドキュメントに入れるコードです。これを実現するために'MyService'クラスのインスタンスが生成されます。そのコードはVisual Studioによって自動的に作成されたものです。'DataTableReader'オブジェクトを使用してデータが順に読み込まれ、ページ内に設定されます。
'Debug'ボタンをクリックするか、F5キーを押して、このソリューションをテストします。ドキュメントがロードされたら、ボタンをクリックすると、Webサービスからデータが取得され、ページ内に自動的に設定されます。
このデータを使用すれば、Word内からカスタムメールマージドキュメントを作成するような処理を実現できます。ここでのポイントは、汎用的なWebサービスからデータが自動的に取得され、Webサービスをおのおのの要件に応じて個別に構成しなくてもよいことです。これは簡単なデモですが、パラメータを使うような構成も可能です。つまり、Webサービスのメソッドにパラメータを与え、そのパラメータを使用して、たとえば、個々の顧客に関する特定のデータを顧客のクライアントIDに基づいて取得することができます。
結論
SOAPのWebサービスは、あらゆる種類のユーザーがサーバー上でおのおのの要件に応じて個別的に修正を行わなくてもデータにアクセスできる点で、業務に高い柔軟性をもたらす優れた方法だと言えます。さらに、Microsoft Office 2007アプリケーション内から直接データにアクセスすることも簡単です。統一的な方法でアクセスできなければ、データの効果的な格納もままなりません。SQL Anywhere 10のSOAPサービスは容易に統合できるので、この目的にかなっています。
参考資料
- Is There Real Business Value Behind the Hype of SOA? Computerworld Management.[Online] June 19, 2006. [Cited: March 1, 2008.]:''Pisello, Tom.''
- SOAP Version 1.2 Part 1: Messaging Framework (Second Edition). W3C Recommendation. Cambridge : s.n., 2007.:''World Wide Web Consortium (W3C).''